取消RxJava中的可观察对象

问题描述 投票:4回答:3

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

怎么可能?

谢谢。

rx-java
3个回答
5
投票

您无法真正告诉Observable取消网络请求,因为RxJava不了解Observable内部运行的代码。您可以使用doOnUnsubscribe检查网络请求是否仍在运行以及是否被取消,然后在要取消时取消订阅。


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等),但答案并没有真正改变,因为所有这些传输都符合此模式。


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

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.