我的情况是,我需要在启动应用程序(Splash屏幕)开始时预取数据。我想通过使用RxJava
实现这一目标,但我对这个库有点新意,所以这并不容易,哈哈。
我Loading Activity
和Start Activity
的顺序相同。当用户看到Loading Activity
我想要获取数据这么长时间,直到可观察的返回应答(成功/错误),然后才创建Start Activity
。我怎么能这样做?
我阅读文档,最好的选择(imho)是BehaviorSubject
。我通常处理这样的网络呼叫:
class DataRepository {
private val retrofit = ..
private val dataService = ..
fun fetchData(): Single<DataModel> {
return dataService.callToApi()
.map { apiObject ->
return@map jsonApiObject.data as DataModel
}
}
}
在这种情况下,fetchData()
将返回Single
。
在Loading Activity
我会调用数据存储库:
private void getDataInLoadingActivity() {
new DataRepository()
.fetchData()
.subscribe(response -> {
..do smth with response
}, t -> {} );
}
好吧,
1。我不知道如何使用我的示例和情况来实施BehaviorSubject
。
2。在我的实例中,调用是异步的,这意味着,数据可能被提取得太晚,并且可能已经创建了Start Activity
而没有我需要的数据。我怎么能避免这个?如何确保Start Activity
仅在LoadingActivity
时开始,具体为getDataInLoadingActivity()
已返回任何结果?
代码示例可以很好地发表评论。
答案 0 :(得分:0)
在DataRepository
中,在获取数据后立即创建Completable
。然后只需在您的活动中订阅该活动,并在dataFetched()
完成之前开始下一个活动。
class DataRepository {
private var completedSubject = BehaviorSubject.create<Boolean>()
fun dataFetched(): Completable {
return completedSubject.take(1).toCompletable()
}
fun fetchData(): Single<DataModel> {
return dataService.callToApi()
.map { apiObject ->
return@map jsonApiObject.data as DataModel
}.doOnSuccess { completedSubject.onNext(true) }
}
}