我有一个正在执行下载的可观察对象。但是,当我点击一个按钮时,我想要取消那个observable。
这怎么可能?
谢谢。
答案 0 :(得分:5)
你无法告诉一个observable取消网络请求,因为RxJava不知道在Observable中运行的代码。您可以做的是使用doOnUnsubscribe
检查网络请求是否仍在运行,如果是取消,则只需取消订阅即可取消。
答案 1 :(得分:2)
这应该给你一般的想法。摘要是使用Observable.using()
并使用Observable
订阅Subscriber
,以便在用户点击取消按钮时拨打subscriber.unsubscribe()
。
这是一个大纲。
Subscriber<T> subscriber = ...;
Observable
// create a stream from a socket and dispose of socket
// appropriately
.using(socketCreator(host, port, quietTimeoutMs),
socketObservableFactory(charset),
socketDisposer(), true)
// cannot ask host to slow down so buffer on
// backpressure
.onBackpressureBuffer()
.subscriber(subscriber);
点击按钮电话:
subscriber.unsubscribe()
这将停止可观察流并致电socketDisposer()
以停止网络活动。
您还没有指定下载的性质(ftp,http等),但答案并没有真正改变,因为所有这些传输都符合这种模式。
答案 2 :(得分:0)
就我而言,我有一个发布主题,该主题在一定条件下正在发射物品。在某些情况下,我想取消它,所以我添加了一个密封的类来保存状态:
sealed class DelayedItem {
object Ignore : DelayedItem()
data class Handle(val text: String) : DelayedItem()
}
我的订户被这样弹跳:
myPublishSubject
.subscribeOn(Schedulers.io())
.debounce(500, TimeUnit.MILLISECONDS)
.subscribe {
if (it is DelayedItem.Handle)
handleItem(it)
}
希望有帮助!