我还在研究RxJava,并用它来做一些与Retrofit 2相关的事情。我已经试了几天了,代码现在看起来更易读了,但遇到了一个我似乎找不到解决办法的问题。
我正在尝试执行一次登录(这将返回一个API令牌),然后使用这个令牌来获取同一链中的一些初始数据,这样链的输出就是令牌+数据。为了做到这一点,我用
apiClient
.login()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(token -> getData(token))
.subscribe(new Subscrber<Bundle>() {...});
这看起来不错,但我也想在启动和停止链条时显示一个进度条。所以我也给它添加了一个.doOnSubscribe()
和一个.doOnUnsubscribe()
。然而,我注意到,在方向更改之后,我试图隐藏的片段进度条始终为空。
所以我搜索并发现了RxLifecycle库,它似乎会有帮助,我现在.cache()
并取消订阅事件链。但我想不出在此之后如何在onCreate()
中再次订阅相同的活动?我想我遗漏了一些非常基本的东西,希望能得到大家的帮助。
发布于 2016-01-02 03:01:55
您不必使用任何架构模式来实现这一点。尽管任何MVP/MVC都是关注点分离、测试等方面的好东西,但让你的Controller/Presenter/DAO成为一个应用程序范围的单例,在整个应用程序生命周期中保持内存并不是一个好主意。
下面是一个使用保留片段实例和RxJava - https://github.com/krpiotrek/RetainFragmentSample的示例项目
这里的主要思想是使用名为setRetainInstance(true)的Fragment,它可以防止它在方向改变时被破坏,并将你的观察值存储在那里。下面是如何在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()运算符。
发布于 2015-12-29 16:10:25
您需要确保订阅从.cache()
返回的same Observable 实例。通常,您会将此实例存储在Singleton (如Application类)、保留片段或Android服务中的某个位置。
https://stackoverflow.com/questions/34243894
复制相似问题