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

我仍然搞清楚RxJava并使用它来做一些networking的东西与改造2.一直试图我们几天,像这样的代码现在看起来更具可读性,但遇到了一个问题,我似乎无法想象的方式周围。

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

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

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

所以我search,碰到RxLifecycle lib,似乎它会帮助,我现在.cache()和退订事件链。 但我不能弄清楚如何在onCreate()之后再次订阅相同的事件? 我想我错过了一些非常基本的东西,将不胜感激任何帮助。

Solutions Collecting From Web of "活动恢复后,RxJava将重新订阅事件"

您不一定必须使用任何架构模式来实现这一点。 尽pipe任何MVP / MVC都是关注分离,testing等的好东西,但是使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必须caching最后一个值,一种方法是使用cache()运算符。

您需要确保您订阅从.cache()返回的相同的 Observable 实例 。 通常你会将这个实例存储在一个Singleton(比如Application类),一个保留的片段或者一个Android服务中。