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

我还在弄清楚RxJava并使用它与Retrofit 2做一些网络工作。我们已经尝试了几天了,而且现在代码看起来更具可读性但遇到了一个我似乎无法想象的问题周围。

我正在尝试执行登录(返回API令牌),然后使用此令牌获取同一链中的所有初始数据,以便链的输出是令牌+数据。 要做到这一点,我用API调用我的API服务

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

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

所以我搜索并遇到了RxLifecycle lib,看起来它会有所帮助,我现在.cache()并取消订阅事件链。 但我不知道如何在此之后再次在onCreate()订阅同一事件? 我想我错过了一些非常基本的东西,并希望得到任何帮助。

您不一定要使用任何架构模式来实现这一点。 虽然任何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()运算符。

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