gpt4 book ai didi

android - Activity 恢复后 RxJava 重新订阅事件

转载 作者:IT老高 更新时间:2023-10-28 23:36:11 27 4
gpt4 key购买 nike

我仍在研究 RxJava 并使用它来使用 Retrofit 2 做一些网络工作。我们已经尝试了几天,现在代码看起来更具可读性,但遇到了一个我似乎无法解决的问题想办法解决。

我正在尝试执行登录(它返回一个 API token ),然后使用此 token 在同一个链中获取一些初始数据,以便链的输出是 token + 数据。为此,我使用

调用我的 API 服务
apiClient
.login()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(token -> getData(token))
.subscribe(new Subscrber<Bundle>() {...});

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

所以我搜索并发现了 RxLifecycle lib 似乎会有所帮助,我现在 .cache() 并取消订阅事件链。但是我不知道在此之后如何在 onCreate() 中再次订阅相同的事件?我想我遗漏了一些非常基本的东西,如果有任何帮助,我将不胜感激。

最佳答案

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

这是一个使用保留 fragment 实例和 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() 运算符。

关于android - Activity 恢复后 RxJava 重新订阅事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34243894/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com