listenzz/Live

检查主线程问题

Blankeer opened this issue · 2 comments

我写的以下代码, x 时间后执行 xx 操作

        Observable.timer(2000, TimeUnit.MILLISECONDS)
                .compose(Live.bindLifecycle(this))
                .subscribe({
                    LogUtil.d("ok")
                    //....
                }, {
                    LogUtil.e(it)
                })

看起来貌似没有问题,但是执行后,没有任何输出,onNextonError都没有被回调,关键是没有任何报错.

看了下源码,跟踪了一下,原因: Live.java#67 assertMainThread();判断当前线程是否为主线程,不是就报错.而我上述的代码,onNext 执行是不在主线程上的,所以这里抛异常了,但是!onError没有收到这个异常信息!!

解决办法: 在compose(Live.bindLifecycle(this))前加上.observeOn(AndroidSchedulers.mainThread())

望优化异常处理.

当时设计只考虑在主线程使用,因为只希望在主线程更新 UI,协助程序员检测忘了调用 observeOn(AndroidSchedulers.mainThread) 的情况。我会完善错误提示机制。

使用 timer 操作符时不会报错,但使用 internal 时会,应该和 rx 的错误处理机制有关系。暂无时间探知具体原因。换了一种订阅方式,现在可以像期待的那样让程序崩溃了。