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

时间:2014-08-15 19:05:43

标签: android multithreading rx-java

我有一个Android应用程序,其中有多个观察者类型为,订阅了多个类型B的Observable 。订阅在IO Scheduler中进行,并在Android主线程上进行观察。

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

问题发生时的相关代码

“NEXT1”和“NEXT2”已打印,但“已接收”,“错误”,已完成但未完成。

            //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消息队列中的消息。
  • 观察员从不打电话取消订阅()

3 个答案:

答案 0 :(得分:21)

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

这将在可观察者和操作者之间记录消息。

答案 1 :(得分:0)

您可以尝试Fernando Cejas的Frodo

  

Frodo就是为实现这一目标而诞生的,并且避免编写用于调试RxJava对象的代码。它基于Java注释,并依赖于Gradle插件,该插件检测何时编译应用程序的Debug构建类型,并编织代码,该代码将在android logcat输出上打印RxJava Objects日志记录信息。

在此处了解更多-https://fernandocejas.com/2015/11/05/debugging-rxjava-on-android/

答案 2 :(得分:0)

您可以尝试Fernando Cejas的FrodoFrodo 2

  

Frodo就是为实现这一目标而诞生的,并且避免编写用于调试RxJava对象的代码。它基于Java注释,并依赖于Gradle插件,该插件检测何时编译应用程序的Debug构建类型,并编织代码,该代码将在android logcat输出上打印RxJava Objects日志记录信息。

@RxLogFlowable
Flowable<Integer> numbers() {
  return Flowable.just(1, 2, 3, 4);
}