【问题标题】:How do i stop rxjava repeat when app is minimized应用程序最小化时如何停止 rxjava 重复
【发布时间】:2018-02-05 19:29:39
【问题描述】:

我有一个每 10 秒重复一次的网络调用。应用最小化时如何停止通话?

注意:这是 RxJava 和 Retrofit 的 MVP。

注意:嵌套调用是为了防止第一次调用需要 10 秒。

注意:这是一个单一的,而不是可观察的。

dataManager.getAnimalsList()     <-----------------call #1   
                .doOnSuccess(coins -> dataManager
                        .getAnimalsList()     <-----------------call #2
                        .delay(10, TimeUnit.SECONDS).repeat()
                        .compose(SchedulerUtils.ioToMain())
                        .subscribe(
                                coinItems -> {
                                    getView().showProgress(false);
                                    getView().showCoinList(coinItems);
                                },
                                throwable -> {
                                    getView().showProgress(false);
                                    getView().showError(throwable);
                                }))
                .compose(SchedulerUtils.ioToMain())
                .subscribe(
                        coinItems -> {
                            getView().showProgress(false);
                            getView().showCoinList(coinItems);
                        },
                        throwable -> {
                            getView().showProgress(false);
                            getView().showError(throwable);
                        });

【问题讨论】:

    标签: android retrofit2 mvp rx-java2


    【解决方案1】:

    我不会做嵌套订阅,我认为不推荐。 我将围绕Observable.interval() 构建我的代码并跟踪应用程序状态,如果您想停止刷新列表,只需确保isApplicationVisible() 返回正确的布尔值。

    Observable.interval(10, TimeUnit.SECONDS)
            .filter(__ -> isApplicationVisible())
            .flatMapSingle(__ -> dataManager.getAnimalsList())
            .subscribe(animalList -> {
                System.out.println(Arrays.toString(animalList.toArray()));
                // do whatever
            });
    

    使用您的代码,它将类似于

    Observable.interval(10, TimeUnit.SECONDS)   
                    .filter(__ -> isApplicationVisible())   
                    .flatMapSingle(__ -> dataManager.getAnimalsList())
                    .compose(SchedulerUtils.ioToMain())
                    .subscribe(coinItems -> {
                                getView().showProgress(false);
                                getView().showCoinList(coinItems);
                            },
                            throwable -> {
                                getView().showProgress(false);
                                getView().showError(throwable);
                            });
    

    【讨论】:

    • 我应该把 isApplicationVisible() 放在哪里? Presenter 不应该在 MVP 中有活动生命周期事件或知道片段?我对么?如果有办法,我只是想尽可能干净地做到这一点。
    • 可能在您的 Activity/Fragment 中,您可以使用 onResume()/onPause() 跟踪应用最小化
    • 我认为 Fragment 中有一个名为 isUserVisibleHint() 或类似名称的方法
    • 为了遵守 MVP,我循环调用 dashPresenter.getAnimals(); 会更好吗?在片段中,这样我就可以访问生命周期事件。并且 Presenter 可以保持无碎片。所以基本上片段会重复调用而不是演示者。我会试一试,然后告诉你。
    • 哇!它起作用了,我不知道为什么我之前没有看到 getView() 。我什至在这个电话之前用了几行。我还在习惯MVP。太感谢了!我还发现我可以使用 Observable.interval(0, 10, TimeUnit.SECONDS))。 0参数是初始延迟!所以我不需要进行嵌套调用!
    【解决方案2】:

    使用活动/片段生命周期来跟踪 api 调用。使用过滤器方法设置布尔标志。您可以使用一次性的 observable 来帮助您在整个生命周期中处理调用。 Read this blog

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      相关资源
      最近更新 更多