【发布时间】:2017-11-02 03:01:53
【问题描述】:
我有一个能够从中断中恢复的网络客户端,但在重试时需要最后一条消息。
Kotlin 中的示例:
fun requestOrResume(last: Message? = null): Flowable<Message> =
Flowable.create({ emitter ->
val connection = if (last != null)
client.start()
else
client.resumeFrom(last.id)
while (!emitter.isDisposed) {
val msg = connection.nextMessage()
emitter.onNext(msg)
}
}, BackpressureStrategy.MISSING)
requestOrResume()
.retryWhen { it.flatMap { Flowable.timer(5, SECONDS) } }
// how to pass the resume data when there is a retry?
问题:如您所见,我需要最后收到的消息来准备恢复电话。如何跟踪它,以便在重试时可以提出恢复请求?
一种可能的解决方案可能是创建一个持有者类,它只保存对最后一条消息的引用,并在收到新消息时更新。这样,当重试时,可以从持有者那里获得最后一条消息。示例:
class MsgHolder(var last: Message? = null)
fun request(): Flowable<Message> {
val holder = MsgHolder()
return Flowable.create({ emitter ->
val connection = if (holder.last != null)
client.start()
else
client.resumeFrom(holder.last.id)
while (!emitter.isDisposed) {
val msg = connection.nextMessage()
holder.last = msg // <-- update holder reference
emitter.onNext(msg)
}
}, BackpressureStrategy.MISSING)
}
我认为这可能有效,但感觉就像是 hack(线程同步问题?)。
是否有更好的方法来跟踪状态以便重试?
【问题讨论】:
标签: android kotlin rx-java rx-java2