【发布时间】:2019-09-18 11:24:45
【问题描述】:
我正在尝试扩展我的自定义FlowableTransformer 的功能,我使用它有条件地从一个Flowable 切换到另一个,由提供的Function<T, Flowable<R>> 返回,即在我的switchFunction 中我将一个项目发送到服务器并切换如果初始项目匹配某些条件,则向服务器响应流动:
/**
* Switches from upstreamFlowable to anotherFlowable
* using switchFunction if item from upstreamFlowable
* matches test condition
*
* usage:
* upstreamFlowable
* .compose(RxSwitchFlowablesOnCondition(condition, switchFunction))
**/
open class
RxSwitchFlowablesOnCondition<T, R>(private val condition : Predicate<T>,
private val switchFunction : Function<T, Flowable<R>>) : FlowableTransformer<T, R>
{
override fun
apply(upstreamFlowable : Flowable<T>) : Publisher<R>
{
return upstreamFlowable
.compose(RxFlowableOnIo<T>())
.filter {emittedItem : T ->
condition.test(emittedItem)
}
.switchMap {emittedItem : T ->
val anotherFlowable = switchFunction.apply(emittedItem)
anotherFlowable
//.timeout(CONNECTION_TIMEOUT_SECONDS, SECONDS) // #1
}
//.timeout(CONNECTION_TIMEOUT_SECONDS, SECONDS) // #2
}
}
如果发生错误,要重新启动链,在我的 android 应用程序中,我使用 retry 运算符:
upstreamFlowable
.compose(RxSwitchFlowablesOnCondition(condition, switchFunction))
.retry() // to resubscribe on error
.subscribe(...)
我想做的是添加timeout逻辑,例如,如果upstreamFlowable发出一个项目和在anotherFlowable获得响应之间的时间大于CONNECTION_TIMEOUT_SECONDS,我想触发一个错误并重新订阅upstreamFlowable,这样我就可以等待下一个emittedItem。
我有什么:
- 如果我取消注释行
#1,则超时会产生TimeoutException,重试重新订阅链,即使没有下一个发射项目,我也会在每个CONNECTION_TIMEOUT_SECONDS时间段继续收到超时异常。 如何跳过它们? - 如果我取消注释行
#2,那么我会在订阅后CONNECTION_TIMEOUT_SECONDS之后收到TimeoutExceptions,而不是自项目发射后。 如何解决?
需要你的帮助。提前谢谢!
【问题讨论】:
标签: generics kotlin timeout rx-java rx-java2