Какой лучший способ отладить проблемы RxJava с не полученными сообщениями

У меня есть приложение Android с несколькими наблюдателями типа A, которые подписываются на несколько Наблюдаемых типа B. Подписка выполняется в Планировщике ввода-вывода и наблюдение в основной теме 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")
            }

У кого-то есть ключ? или какие-либо рекомендации по его отладке?

Что я проверил:

  • Я приостановил приложение и проверил, что все потоки, чтобы узнать, заблокирован ли он. И aparentlly все рабочие потоки припаркованы, а основной поток ожидает сообщений в очереди сообщений Android.
  • Наблюдатели никогда не называют unsubscribe()

Ответы

Ответ 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);
        }
  }));

Это будет вести журнал сообщений, пока они идут между наблюдаемыми и операторами.

Ответ 2

Вы можете попробовать Фродо и Фродо 2 от Фернандо Сехаса

Фродо был рожден, чтобы достичь этого и избежать написания кода для отладки объектов RxJava. Он основан на аннотациях Java и опирается на плагин Gradle, который определяет, когда компилируется тип сборки Debug вашего приложения, и создает код, который будет печатать информацию журналирования объектов RxJava на выходе android logcat.

Подробнее здесь