RxJava:如何在取消订阅时中断线程?

时间:2015-05-12 12:49:25

标签: rx-java cancellation

我使用Observable.create()创建一个observable来对调度程序执行某些工作(例如Schedulers.io(),然后在AndroidSchedulers.mainThread()上返回结果。

val subscription = observable<T> {
        try {
            // perform action synchronously
            it.onNext(action.invoke(context, args))
            it.onCompleted()
        } catch (t: Exception) {
            it.onError(t)
        }
    }.subscribeOn(scheduler)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    {
                        // handle result here
                        result.set(it)
                    },
                    {
                        // handle error here
                        errorHandler.handleTaskError(model, this, it)
                    },
                    {
                        // notify completed
                        model.completeTask(this)
                    }
            )

action.invoke()内的操作是同步的,可能是阻塞IO操作。当用户决定取消它时,我取消订阅observable:subscription.unsubscribe()

但是,I / O操作不会中断。是否有任何rx-java API来中断操作?

3 个答案:

答案 0 :(得分:9)

当您致电yourSubscription.unsubscribe();时,Rx会拨打您的取消订阅代码。

这个未说明的代码将是Subscription类,当您创建add时,subscriber可以ObservableObservable<Object> obs = Observable.create(subscriber -> { subscriber.add(new Subscription() { @Override public void unsubscribe() { // perform unsubscription } @Override public boolean isUnsubscribed() { return false; } }); subscriber.onNext(/**...*/); subscriber.onCompleted(); }

unsubscribe

所以在ob_start()方法中,如果你有办法,可以打断你的工作。

请注意,取消订阅Observable或完成时观察An Observable时会调用取消订阅方法。 (它将自行取消订阅)

修改:在帐户

中提取vladimir mironov条评论

答案 1 :(得分:3)

RxJava调度程序使用Furure.cancel(true)来中断正在运行的操作,所以如果你有一个中断敏感操作(例如Thread.sleep()),你应该看到线程中断,尽管你不能这样做很多,因为在那一点上,整个下游链已被取消订阅,没有其他事件可以到达您的订阅者。

如果您的操作对中断不敏感,并且它没有提供任何标准方法来中断它(例如在套接字上调用close(),或在JDBC语句上调用cancel(), RxJava无法做很多事情。

如果可以异步调用某个close()方法,请考虑使用using(),这样就可以指定一个可以在取消订阅时关闭资源的清理回调。

答案 2 :(得分:0)

据我所知,RxJava是不可能的。

您可以继续引用可观察对象之外的action对象,并将其与unsubscribe调用一起中断。