RxJava分别和一起订阅多个可观察对象

时间:2019-03-19 01:35:43

标签: android kotlin rx-java

我有两个网络请求。

fun getPostDetail(postId: Int): Single<Post>
fun getComments(postId: Int): Single<List<Post>>

我想做的是...

  1. 启动时显示加载屏幕。这两个请求应该独立工作。
  2. 每个请求完成后,显示结果也会更新。
  3. 所有请求终止时,隐藏加载屏幕。

我具有处理加载页面的功能:

fun showLoadingScreen()
fun hideLoadingScreen()

并操作视图:

fun showPostDetails(post)
fun showComments(comments)

我已经尝试过这种方式-订阅每个,也订阅合并的一个:

postDetail = getPostDetail(postId)
getComments = getComments(postId)

postDetail.subscribe()
getComments.subscribe()

Single.merge(postDetail, getComments).subscribe()

在这种情况下,它发出多个请求,而不是一次。

解决此类问题的最佳方法是什么?我可以使用CountDownLatch来计算每个请求的完成情况,但是RxJava中还有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用doOnSuccess

postDetail = getPostDetail(postId).doOnSuccess { showPostDetails(it) }
getComments = getComments(postId).doOnSuccess { showComments(it) }

然后将它们合并

Single.merge(postDetail, getComments)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnSubscribe {
        showLoadingScreen()
    }
    .doOnTerminate {
        hideLoadingScreen()
    }
    .subscribe()