RxJava在活动恢复后重新订阅事件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (8)

我仍然在搞清楚RxJava,并用它来做一些网络工作,并使用Retrofit 2.我们已经尝试了几天,现在代码看起来更具可读性,但遇到了一个问题,我似乎无法找到一个方法周围。

我正在尝试执行登录(它返回一个API令牌),然后使用此令牌在同一链中获取一些初始数据,以便链的输出为令牌+数据。要做到这一点,我打电话给我的API服务

apiClient
    .login()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .flatMap(token -> getData(token))
    .subscribe(new Subscrber<Bundle>() {...});

这看起来很好,但我也想在启动和停止链条时显示进度条。所以我也加了一个.doOnSubscribe()和一个.doOnUnsubscribe()。不过,我注意到在方向更改后,我试图隐藏进度栏的片段始终为空。

所以我搜索了一下RxLifecycle lib,看起来好像有帮助,现在我.cache()退订了事件链。但是我不知道如何onCreate()在这之后再次订阅相同的事件?我想我错过了一些非常基本的东西,并希望得到这方面的帮助。

提问于
用户回答回答于

您需要确保您订阅从中返回的相同 Observable 实例.cache()。通常,您可以将此实例存储在单例中的某个位置(如Application类),保留的片段或Android服务。

用户回答回答于

您不一定必须使用任何体系结构模式才能实现此目标。尽管任何MVP / MVC对于分离,测试等都是很好的事情,但是使Controller / Presenter / DAO成为一个应用程序范围内的单例,它在整个应用程序的生命中保持内存不是一个好主意。

这是一个使用保留片段实例和RxJava的示例项目 - https://github.com/krpiotrek/RetainFragmentSample

主要思想是使用调用了setRetainInstance(true)的 Fragment ,这样可以防止它在方向更改时被破坏,并将Observable存储在那里。以下是您在Activity / Fragment onCreate中处理的方法

protected void onCreate(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        // first run, create observable
        mInfoObservable = createInfoObservable();
        // set Observable in retained fragment
        RetainFragmentHelper.setObject(this, getSupportFragmentManager(), mInfoObservable);
    } else {
        // following runs, get observable from retained fragment
        mInfoObservable = RetainFragmentHelper.getObjectOrNull(this, getSupportFragmentManager());
    }

    // subscribe 
    mInfoObservable.subscribe(...);
}

请记住,你的Observable必须缓存最后一个值,一种方法是使用cache()运算符。

扫码关注云+社区