在RxJava中执行每个Concat元素之前如何做?

时间:2019-11-28 11:24:58

标签: android kotlin system.reactive

我正在用Kotlin编写api同步模块。我想向人们展示当前正在下载什么应用,但我对此有疑问。让我向您展示我在做什么的示例代码:

private val downloadProcessNameList = listOf(
    "Controller 1",
    "Controller 2"
)

private val downloadList = listOf(
    controller1.allFromApi(),
    controller2.allFromApi()
)

init {
    liveDownloadPercent.postValue(0)
    liveSavePercent.postValue(0)

    mDisposable.add(
        Maybe.concat(downloadList)
            .doOnNext { liveDownloadStatus.postValue(downloadProcessNameList[i]) }
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .subscribe(
                {
                    Log.i(LOG_HEADER, it.size.toString())

                    i++
                },
                {
                    Log.e(LOG_HEADER, it.message)
                },
                {
                    Log.i(LOG_HEADER, "onComplete")
                }
            )
    )
}

问题出在这行

.doOnNext { liveDownloadStatus.postValue(downloadProcessNameList[i]) }

它会在第一个cotroller响应后立即执行,并且用户首先看不到应用程序在做什么。我到处搜索,找不到正确的答案。在开始Concat之前如何显示 downloadProcessNameList [i] 中的信息?当然可以在Maybe.concat之外显示该信息,但我不喜欢它吗?也许您知道该怎么办。

预先感谢您, 保罗

1 个答案:

答案 0 :(得分:1)

您可以使用doOnSubcribe(),一旦观察到订阅,就会立即调用它