取消RxJava中的Observable

时间:2015-10-14 13:04:24

标签: rx-java

我有一个正在执行下载的可观察对象。但是,当我点击一个按钮时,我想要取消那个observable。

这怎么可能?

谢谢。

3 个答案:

答案 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)
            }

希望有帮助!