在 RxJava 中调试代码比普通同步代码稍微麻烦一些,因为逻辑是异步、链式、基于事件的。下面从常用调试手段到实战技巧系统讲一下。
doOnXXX 系列操作符这是最常用的调试手段。
Observable.just(1, 2, 3)
.doOnSubscribe(d -> Log.d("RX", "subscribe"))
.doOnNext(i -> Log.d("RX", "next: " + i))
.doOnError(e -> Log.e("RX", "error", e))
.doOnComplete(() -> Log.d("RX", "complete"))
.subscribe();
常用:
doOnSubscribedoOnNextdoOnErrordoOnCompletedoOnDisposedoFinally✅ 优点:无侵入、好用
❌ 缺点:只能打日志
RxJava 最大的坑是线程切换错误
Observable.just(1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(i ->
Log.d("RX", "thread=" + Thread.currentThread().getName())
)
.subscribe();
✅ 确认:
.subscribe(
next -> {},
error -> Log.e("RX", "error", error)
);
RxJava 异常常被包装:
.onErrorResumeNext(e -> {
Log.e("RX", "real error", e);
return Observable.empty();
})
RxJavaPlugins全局拦截错误(非常有用):
RxJavaPlugins.setErrorHandler(throwable -> {
Log.e("RX_GLOBAL", "uncaught", throwable);
});
✅ 用于:
onError在:
subscribe()map / flatMaponNext打断点,看:
⚠️ 注意:
observeOn 控制线程更方便调试Observable#compose(统一调试)public <T> ObservableTransformer<T, T> debug(String tag) {
return upstream -> upstream
.doOnNext(t -> Log.d(tag, "data=" + t))
.doOnError(e -> Log.e(tag, "err", e));
}
使用:
observable.compose(debug("USER"));
TestObserver(单元测试神器)TestObserver<Integer> test = Observable.just(1, 2)
.test();
test.assertNoErrors();
test.assertValueCount(2);
✅ 不需要 UI
✅ 精确控制时间
rxjava2-debugrxlint(Android)可以打印:
检查:
subscribe 没调用filter 过滤掉observeOn 切错线程disposeRxJavaPlugins.setErrorHandler(...)
CompositeDisposableonDestroy 中 clear()✅ 是否打了 doOnNext / doOnError
✅ 是否确认线程
✅ 是否有 onError
✅ 是否 dispose
✅ 是否使用 RxJavaPlugins
如果你愿意,可以:
我可以帮你逐行分析哪儿错了。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。