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

时间:2015-12-12 19:17:40

标签: android retrofit rx-java android-lifecycle

我还在弄清楚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()之后再次订阅相同的事件?我想我错过了一些非常基本的东西,并希望对此有任何帮助。

2 个答案:

答案 0 :(得分:1)

您不必使用任何架构模式来实现这一目标。虽然任何MVP / MVC都是关于分离,测试等问题的好东西,但是让你的Controller / Presenter / DAO成为一个应用程序范围的单例,它可以在整个应用程序的生命周期中保持内存并不是一个好主意。

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

主要思想是将Fragment与 setRetainInstance(true)一起使用,以防止它在方向更改时被破坏,并将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()运算符。

答案 1 :(得分:0)

您需要确保订阅从.cache()返回的相同可观察实例。通常,您将此实例存储在Singleton(如Application类),保留片段或Android Service中。