android 如何在rxkotlin中链接“单个-可完成-可完成”?

kyvafyod  于 2023-03-06  发布在  Android
关注(0)|答案(2)|浏览(61)

我是rxjava/rxkotlin/rxandroid的初学者。
我需要依次处理三个不同的异步调用,问题是第一步返回Single<LocationResult>,第二步返回Completable,第三步返回Completable
(单个-〉可完成-〉可完成)
现在的问题是最后一个Completable依赖于第一个Single的数据
我目前的解决方案:
我认为这是个糟糕的解决方案,但我不知道该怎么做。

val ft = FenceTransaction(applicationContext, apiClient)
        stream
            .flatMap { locationResult ->
                ft.removeAll()
                return@flatMap ft.commit().toSingle({ return@toSingle locationResult })
            }
            .flatMapCompletable {
                ft.recycle()
                ft.setZone(it.location.longitude, it.location.latitude, ZONE_RADIUS)
                val dots = DotFilter().getFilteredDots()
                for (dot in dots) {
                    ft.addDot(dot)
                }
                return@flatMapCompletable ft.commit()
            }
            .subscribeBy(
                onComplete = {
                    "transaction complete".logi(this)
                },
                onError = {
                    "transaction error".logi(this)
                })

这种方法是正确的吗?
那么Completeables应该怎么处理呢?一般什么时候处理Observables呢?

oxf4rvwz

oxf4rvwz1#

不知道你是否仍然有这个问题,但通常对于Single-〉Completable-〉Completable,你会这样做:

val disposable = service.getSingleResult()
                        .flatMapCompletable { locationResult ->
                            callReturningCompletable(locationResult)
                        }
                        .andThen { finalCompletableCall() }
                        .subscribe({...}, {...})
dwthyt8l

dwthyt8l2#

fun demo(): Completable {
    return Single
        .fromCallable {
            "lol" // original value from single
        }.flatMap { // "lol" become the param of this flatmap lambda
            Completable
                .fromCallable { Log.d("xxxx", "$it, completable 1") }
                .andThen(
                    Single.fromCallable { it } // `it` is "lol" we create a new single to continue pass the value downstream
                )
        }.flatMapCompletable { // "lol" again become the param of the lambda here
            if (it == "lol") { // we can now access the "lol" here
                Completable.fromCallable { Log.d("xxxx", " completable 2 HAPPY") }
            } else {
                Completable.fromCallable { Log.d("xxxx", " completable 2 SAD") }
            }
        }
}

Single-〉Completable-〉Completable的演示,我认为主要的事情是在第一个Completable之后链接一个Single,它返回原始Single的值。
这将使链看起来像:Single "value 1" -> Completable -> Single "value 1" -> Completabe,这将使最后一个子句flatMapCompletable访问原始的value 1,因此我们可以决定在最后使用哪个Completable

相关问题