调试未收到消息的 RxJava 问题的最佳方法是什么



我有一个Android应用程序,它有多个类型为A的观察者,订阅了几个类型为B观察者。订阅是在IO Scheduler和Android主线程的观察中完成的。

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

问题发生时的相关代码:

打印"NEXT1"one_answers"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()

到目前为止,我无法重现问题,但我发现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);
        }
  }));

将记录在可观察对象和操作符之间传递的消息

最新更新