Какой лучший способ отладить проблемы 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.
Подробнее здесь