Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rx java 在RxJava中取消一个可观测的_Rx Java - Fatal编程技术网

Rx java 在RxJava中取消一个可观测的

Rx java 在RxJava中取消一个可观测的,rx-java,Rx Java,我有一个可观察到的正在执行下载。然而,当我点击一个按钮时,我想取消那个可观察的 这怎么可能 谢谢。您不能真正告诉可观察对象取消网络请求,因为RxJava不知道可观察对象内部运行的代码。您可以使用dounsubscribe检查网络请求是否仍在运行,如果是取消,则在您想要取消时取消订阅。这应该会让您大致了解情况。摘要是使用Observable.use()并使用订户订阅Observable,这样当用户单击按钮取消时,您可以调用订户。unsubscribe() 这是一个提纲 Subscriber<

我有一个可观察到的正在执行下载。然而,当我点击一个按钮时,我想取消那个可观察的

这怎么可能


谢谢。

您不能真正告诉可观察对象取消网络请求,因为RxJava不知道可观察对象内部运行的代码。您可以使用
dounsubscribe
检查网络请求是否仍在运行,如果是取消,则在您想要取消时取消订阅。

这应该会让您大致了解情况。摘要是使用
Observable.use()
并使用
订户订阅
Observable
,这样当用户单击按钮取消时,您可以调用
订户。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);
这将停止可观察流并调用
socketDisposer()
停止网络活动


您尚未指定下载的性质(ftp、http等),但答案并没有真正改变,因为所有这些传输都符合此模式。

在我的案例中,我有一个发布主题,它在特定条件下发送项目。在某些情况下,我想取消它,因此我添加了一个保存状态的密封类:

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

希望有帮助

你能提供一些你已经尝试过的代码吗?是的,使用<代码>是个好主意,但我可能会让按钮点击也反应,只使用<代码>可观察。。takeUntil(button.clickedSource())
而不是使用订阅服务器。
myPublishSubject
            .subscribeOn(Schedulers.io())
            .debounce(500, TimeUnit.MILLISECONDS)
            .subscribe {
                if (it is DelayedItem.Handle)
                    handleItem(it)
            }