当前位置: 首页 > 知识库问答 >
问题:

如何使用RxJava和Android订阅执行任务

张丁雷
2023-03-14

我只是把我的脚趾头浸入RxJava中,所以请温柔点:)到今天为止,我对异步任务还可以,但它变得越来越复杂,我想我终于偶然发现了一个需求,实际上我很难用简单的异步任务来满足这个需求。这是我的用例:

1)我有一个方法(我们称之为checkNetwork()),它需要在会话中运行一次。如果以前运行过,它会返回缓存的响应。否则,它会执行一个网络html" target="_blank">调用,然后根据结果执行另一个。这两个网络任务都使用OkHttp运行,并且是同步的。方法本身是从AsyncTask运行的。例如:

public class MyApis{

  private boolean mCachedResult;
  private boolean mNetworkChecked;

  ....

  public boolean checkNetwork() {
    if (mNetworkChecked) {
      return mCachedResult;
    }
    doFirstCall();
    // check response, set flags and potentially return
    doSecondCall();
    // check response, set flags, i.e.

    mCachedResult = response.blah
    mNetworkChecked = true;
  }

  public boolean isNetworkChecked(){
    return mNetworkChecked;
}

2)我的代码有多个部分将运行IsNetworkChecked(),如果不运行,则调用CheckNetwork()。在网络条件较差的情况下,CheckNetwork()可能会得到很好的时间,而IsNetworkChecked()将返回false。这将生成相当多的异步任务并将其排入队列。是的,这些任务将很快解决,但我遇到了执行器上默认队列大小的问题。

据我所知,RxJava可以帮助我做到这一点。我想要做的是只运行checkNetwork()一次,如果它已经在运行,那么就不对AsyncTasks进行排队,只需订阅,等待它完成并根据响应执行我的代码(即我的示例中的McachedResult)。

共有1个答案

公冶高义
2023-03-14

您可以在RxJava 1.0.15中使用fromcallablereplay(1):

Observable<Blah> blahs = Observable.fromCallable(() -> {
    doFirstCall();
    doSecondCall();
    return response.blah;
})
.subscribeOn(Schedulers.io())
.replay(1).autoConnect(0);

blahs.observeOn(AndroidSchedulers.mainThread())
.subscribe(...)
 类似资料:
  • 我是RxJava的新手。我有一个,用于下载图像URL列表并将其转换为位图的简单网络操作。 在活动的上,我取消订阅可观察到的以避免内存泄漏。 我能看到的是,如果我在图像下载过程中退出活动,后台任务也会被终止。我只想继续做背景工作,即使我已经取消了《观察家》的订阅。有可能吗?

  • 第一,我试过了 第二,我尝试了下面的。(使用onErrorResumeNext),但取消了订阅。 (未调用onError,但调用OnComplete。因此已取消订阅) 第三,我试了下面。(带重试) 这比第一好。但没有刻录。 我想使刷新按钮,工作后错误。 我想知道 null 对不起,我的英语太差了。

  • 在这篇文章之后,我正在使用带有RxJava/RxKotlin Flowable的Room。我让它运行,但在带有3个片段的ViewPager中使用它存在问题。 我将向您介绍我的代码: 我有一个带有选项卡布局和三个片段(A、B和收藏夹)的视图分页器。前两个片段包含可以添加到收藏夹的数据列表。 在最喜欢的片段中,我使用Flowable来监听A和B所做的更改并相应地更新列表。但是,当一个项目在A和B中成为

  • 例: 注意:是非Android 运行环境, 使用的是RxJava2.x

  • 我有一个< code>Observable链(RxJava 1),我想在Observable完成它的工作时(就在它发出某个东西之前),但在调用任何订户回调之前(我想更新某个< code>AtomicBoolean值,并让所有订户都看到新值),执行一些一次性操作。 以线程安全的方式执行此操作的最佳选择是什么? 我检查了 ,,,但似乎没有关于顺序的保证:我放了一些日志,有时在任何这些方法之前执行第一个

  • 语境: 给定一个WooCommerce和WooCommerce订阅的WordPress网站,我试图获取特定用户订阅的列表。在最近的更新之前,这一行代码已经为我解决了这个问题。以下是我一直在使用的代码: 其中$user\u id是WordPress中的有效用户id。 问题: 自上次更新以来,我们经常看到以下错误: 致命错误:在/home/warfarep/public_html/wp content