У меня есть приложение для Android с несколькими наблюдателями типа A, которые подписываются на несколько Observable типа 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()
onNext(msg)
напрямую в своем методеcall
, а на самом деле делаетеsubscribe.onNext(msg)
? - person Miguel   schedule 16.08.2014