温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

rxjava如何调试代码

发布时间:2026-09-20 15:17:26 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 RxJava 中调试代码比普通同步代码稍微麻烦一些,因为逻辑是异步、链式、基于事件的。下面从常用调试手段实战技巧系统讲一下。


一、最基础的调试方式(人人都要会)

1️⃣ 使用 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();

常用:

  • doOnSubscribe
  • doOnNext
  • doOnError
  • doOnComplete
  • doOnDispose
  • doFinally

✅ 优点:无侵入、好用
❌ 缺点:只能打日志


二、查看线程(非常关键)

RxJava 最大的坑是线程切换错误

Observable.just(1)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnNext(i -> 
        Log.d("RX", "thread=" + Thread.currentThread().getName())
    )
    .subscribe();

✅ 确认:

  • 数据在哪产生
  • 在哪消费
  • 是否切错线程

三、异常调试(重点)

1️⃣ 捕获异常

.subscribe(
    next -> {},
    error -> Log.e("RX", "error", error)
);

2️⃣ 查看异常链

RxJava 异常常被包装:

.onErrorResumeNext(e -> {
    Log.e("RX", "real error", e);
    return Observable.empty();
})

3️⃣ 使用 RxJavaPlugins

全局拦截错误(非常有用):

RxJavaPlugins.setErrorHandler(throwable -> {
    Log.e("RX_GLOBAL", "uncaught", throwable);
});

✅ 用于:

  • 漏掉 onError
  • 异步线程崩溃

四、使用断点调试(很多人忽略)

✅ 断点依然可用

在:

  • subscribe()
  • map / flatMap
  • onNext

打断点,看:

  • 当前线程
  • 变量值
  • 调用栈

⚠️ 注意:

  • 异步代码断点会跳线程
  • observeOn 控制线程更方便调试

五、高级调试工具

1️⃣ 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"));

2️⃣ 使用 TestObserver(单元测试神器)

TestObserver<Integer> test = Observable.just(1, 2)
    .test();

test.assertNoErrors();
test.assertValueCount(2);

✅ 不需要 UI
✅ 精确控制时间


3️⃣ 使用 RxJava Debug 扩展(第三方)

  • rxjava2-debug
  • rxlint(Android)

可以打印:

  • 哪个 operator 出错
  • 调用栈

六、常见调试场景

❌ 收不到数据?

检查:

  • subscribe 没调用
  • filter 过滤掉
  • observeOn 切错线程
  • dispose

❌ 闪退但没日志?

RxJavaPlugins.setErrorHandler(...)

❌ 内存泄漏?

  • 使用 CompositeDisposable
  • onDestroyclear()

七、调试 Checklist(建议收藏)

✅ 是否打了 doOnNext / doOnError
✅ 是否确认线程
✅ 是否有 onError
✅ 是否 dispose
✅ 是否使用 RxJavaPlugins


如果你愿意,可以:

  • 发一段 具体 RxJava 代码
  • 或说明 调试不出的具体问题

我可以帮你逐行分析哪儿错了

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI