我使用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来中断操作?
答案 0 :(得分:9)
当您致电yourSubscription.unsubscribe();
时,Rx会拨打您的取消订阅代码。
这个未说明的代码将是Subscription
类,当您创建add
时,subscriber
可以Observable
到Observable<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
调用一起中断。