使用RxJava

时间:2018-02-09 12:09:29

标签: java android kotlin rx-java2

我的情况是,我需要在启动应用程序(Splash屏幕)开始时预取数据。我想通过使用RxJava实现这一目标,但我对这个库有点新意,所以这并不容易,哈哈。

Loading ActivityStart 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()已返回任何结果? 代码示例可以很好地发表评论。

1 个答案:

答案 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) }
    }
}