首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RxJava在活动恢复后重新订阅到事件

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

Stack Overflow用户
提问于 2015-12-13 03:17:40
回答 1查看 2.5K关注 0票数 16

我还在研究RxJava,并用它来做一些与Retrofit 2相关的事情。我已经试了几天了,代码现在看起来更易读了,但遇到了一个我似乎找不到解决办法的问题。

我正在尝试执行一次登录(这将返回一个API令牌),然后使用这个令牌来获取同一链中的一些初始数据,这样链的输出就是令牌+数据。为了做到这一点,我用

代码语言:javascript
复制
apiClient
    .login()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .flatMap(token -> getData(token))
    .subscribe(new Subscrber<Bundle>() {...});

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

所以我搜索并发现了RxLifecycle库,它似乎会有帮助,我现在.cache()并取消订阅事件链。但我想不出在此之后如何在onCreate()中再次订阅相同的活动?我想我遗漏了一些非常基本的东西,希望能得到大家的帮助。

EN

回答 1

Stack Overflow用户

发布于 2016-01-02 03:01:55

您不必使用任何架构模式来实现这一点。尽管任何MVP/MVC都是关注点分离、测试等方面的好东西,但让你的Controller/Presenter/DAO成为一个应用程序范围的单例,在整个应用程序生命周期中保持内存并不是一个好主意。

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

这里的主要思想是使用名为setRetainInstance(true)的Fragment,它可以防止它在方向改变时被破坏,并将你的观察值存储在那里。下面是如何在Activity/Fragment onCreate中处理它

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34243894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档