android - 在 Android 上调试时 RxJava 缓存线程中的 InterruptedException

标签 android rx-java rx-android interrupted-exception

有时,当我调试我的应用程序时,我会在 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/

相关文章:

java - Android 应用程序上的多个传感器

java - Android dagger2模块无法注入(inject)其他模块

android - 我的 Android 应用程序能否检测到它是否是从 Eclipse 启动的?

java - 无法获取适用于 Android 的 GET 请求

java - 如何使用RxJava进行文件解析和SQL生成?

android - 您能告诉我以下订阅示例有什么问题吗?

java - RxJava 两个请求按顺序

java - Observable的doOnError正确位置

具有 rx 顺序请求的 Android retrofit2

java - RxJava Observer 不兼容的类型