有时,当我调试我的应用程序时,我会在 RxCachedThreadScheduler-1 中遇到 InterruptedException。这是踪迹:
Fatal Exception: java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:1991)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2025)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1048)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:776)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035)
我有一个自定义 View ,我在其中像这样订阅我的可观察对象:
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
sub = FollowHandler.getInstance().getObservable()
.filter(new Func1<FollowEvent, Boolean>() {
@Override
public Boolean call(FollowEvent followEvent) {
if(followEvent == null || followEvent.user == null
|| user == null)
return false;
return followEvent.user.id == user.id;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<FollowEvent>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(FollowEvent followEvent) {
reactToThisNiceEvent(followEvent);
}
});
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if(sub != null)
sub.unsubscribe();
}
这是可观察的:
eventSubject.asObservable()
.observeOn(Schedulers.io())
.doOnNext(new Action1<FollowEvent>() {
@Override
public void call(FollowEvent followEvent) {
if(followEvent != null)
doSomethingNice(followEvent);
}
})
.share();
其中 eventSubject 是一个简单的 PublishSubject。 我正在使用 RxAndroid 1.1.0 和 RxJava 1.1.0。
有人知道为什么会这样吗?
最佳答案
我不确定为什么会这样,但请尝试这样做:
sub = FollowHandler.getInstance().getObservable()
.filter(...)
.subscribeOn(Schedulers.io()) // <<<<<<<<<<
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
此外,我认为您不需要share()
:
eventSubject.asObservable()
.doOnNext(...)
.subscribeOn(Schedulers.io()) // <<<<< subscribeOn instead of observeOn, but actually, you don't need it here...
.share(); // <<<<< remove it
如上所述,我经常使用 Subject
作为事件总线。我从来没有遇到过这样的问题。
附言
在 onDetachedFromWindow()
中,如果您检查订阅是否取消订阅会更好。我知道这个方法在主线程中调用,并发访问这个 Subscription
是不可能的,但我认为这是很好的风格:
if(sub != null && !sub.isUnsubscribed())
sub.unsubscribe();
关于android - 在 Android 上调试时 RxJava 缓存线程中的 InterruptedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34879993/