2015-12-12 73 views
16

我还是搞清楚RxJava,并用它做与改造2.一些网络的东西一直试图就我们对AA几天,喜欢的代码看起来更具可读性,但现在所遇到的一个我似乎无法解决的问题。RxJava重新订阅事件活动后恢复

我试图执行登录(它返回一个API令牌),然后使用该令牌都在同一个链中获取一些初始数据使得链条的输出为所述令牌+数据。要做到这一点,我打电话给我的API服务与

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

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

因此,我搜索并遇到了RxLifecycle库,似乎它会帮助和我现在.cache()和取消订阅事件链。但是我不知道如何在onCreate()之后再次订阅相同的活动?我想我错过了一些非常基本的东西,并希望得到任何帮助。

+1

你能做的最好的事情我分开你的逻辑和实现'MVP'模式。在此之后,'Presenter'类(理想情况下应该是每个视图实例的单例)将处理所有联网并在屏幕旋转后保持视图重建。实际上,有一个很漂亮的库允许使用基于rxJava的'MVP'模式https://github.com/konmik/nucleus(它非常小)。即使你不想使用它,你可以得到一个想法,它是如何实现的 – Than

+0

嗯..好了,所以我想我需要才去下来RxJava航线上良好的MVP执行读了,以及... –

+1

'MVP'可以使代码更cleanier,将解决这个问题,但也许它不是你要找的(这不是那么容易整个应用程序架构切换到MVP)解决方案(这就是为什么我没有张贴它作为回答)。我相信你有一种方法可以在不使用MVP的情况下使用任何第三方库或一些很好的模式,但我没有任何干净的解决方案。把我上面的评论当作“别人如何处理类似问题”。 – Than

回答

0

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

+0

要小心,因为cache()也会缓存错误! – scana

1

你不必使用任何架构模式来实现这一目标。虽然任何MVP/MVC是好事,对于关注点分离,检测等,使您的控制器/演示/ DAO的应用范围单,这使内存通过整个应用程序生命周期是不完全是一个好主意。

下面是使用保留的片段实例和RxJava样本项目 - https://github.com/krpiotrek/RetainFragmentSample

主要思路是利用碎片与setRetainInstance(真)调用,以保护它从方向变化被破坏,并保存你的在那里可以观察。这里是你如何处理,在活动/片段的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(...); 
} 

请记住,你可观察到具有缓存最后一个值,一种方法是使用缓存()操作。