【问题标题】:What's the best way to debug RxJava problems with not received messages调试未收到消息的 RxJava 问题的最佳方法是什么
【发布时间】:2014-08-15 19:05:42
【问题描述】:

我有一个 Android 应用,其中包含多个 A 类观察者,这些观察者订阅了多个 B 类观察者。订阅在 IO Scheduler 中完成,在 Android 主线程上进行观察。

我遇到的问题是,随机在完成一些工作后,B 发出的一条消息从未在 A 中收到,并且经过几个小时的调试后,我找不到原因。

相关代码问题发生时

"NEXT1" 和 "NEXT2" 被打印,但 "RECEIVED","ERROR", COMPLETED 不是。

            //The subscription
            B.getMessate()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(A);

            //B
            Observable<msg> getMessage() {
                 return Observable.create(new Observable.OnSubscribe<msg>() {    
                      public void call(Subscriber<? super msg> subscriber) {
                         ...
                         subscriber.onNext(msg)
                         println("NEXT1")
                      }
                 }).doOnNext({ (o) -> println("NEXT2")});
            }



            //A 
            onNext(msg) {
                  //Never called when problem happens
                  println("RECEIVED")
            }
            onError(msg) {
                  //Never called when problem happens
                  println("ERROR")
            }
            onError(msg) {
                  //Never called when problem happens
                  println("COMPLETED")
            }

有人知道吗?或者有什么调试建议?

我检查过的内容:

  • 我已暂停应用程序并检查所有线程是否已锁定。而且显然所有工作线程都已停放,主线程正在等待 android 消息队列中的消息。
  • 观察者从不调用 unsubscribe()

【问题讨论】:

  • 我假设这只是伪代码,并且您不是在您的 call 方法中直接调用 onNext(msg),而是实际上在执行 subscribe.onNext(msg)?
  • 你为什么不给我们一个真正的短代码,可以重现你的问题。这可能更容易发现问题。
  • 我已经更正了在订阅者上调用 onNext 的伪代码。关于提供真正的短代码,问题在于subscriber.onNext() 之前的实际代码又大又复杂。但我认为这无关紧要,因为调用了“NEXT2”。与往常一样,魔鬼在细节上,但该代码是我以清晰的方式说明我的问题的最佳意图。

标签: android multithreading rx-java


【解决方案1】:

现在我无法重现该问题,但我发现RxJavaDebug 是一个非常好的调试工具。

它的使用很简单:将库添加为依赖项,并在应用程序启动时注册一个监听器:

  RxJavaPlugins.getInstance().registerObservableExecutionHook(new DebugHook(new DebugNotificationListener() {
      public Object onNext(DebugNotification n) {
          Log.v(TAG, "onNext on " + n);
          return super.onNext(n);
      }


        public Object start(DebugNotification n) {
            Log.v(TAG, "start on " + n);
            return super.start(n);
        }


        public void complete(Object context) {
            Log.v(TAG, "complete on " + context);
        }

        public void error(Object context, Throwable e) {
            Log.e(TAG, "error on " + context);
        }
  }));

这将在消息在可观察对象和操作符之间传输时记录消息。

【讨论】:

  • 什么是DebugHook?你在哪里定义它。
  • rx.plugins.DebugHook 是一个 RxJava 类,直接导入即可。
  • 它是否适用于 RxJava 2.x?我看到这个项目已经一年多没有更新了。
  • 对我来说上下文总是null。这应该是这样的吗?因为这样很难找出哪个 observable 完成或抛出了错误。
  • 找到null 问题的解决方案:使用rx.plugins.SimpleDebugNotificationListener 负责填充上下文。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2010-11-23
相关资源
最近更新 更多