【发布时间】:2014-08-15 19:05:42
【问题描述】:
我有一个 Android 应用,其中包含多个 A 类观察者,这些观察者订阅了多个 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()
【问题讨论】:
-
我假设这只是伪代码,并且您不是在您的
call方法中直接调用onNext(msg),而是实际上在执行subscribe.onNext(msg)? -
你为什么不给我们一个真正的短代码,可以重现你的问题。这可能更容易发现问题。
-
我已经更正了在订阅者上调用 onNext 的伪代码。关于提供真正的短代码,问题在于subscriber.onNext() 之前的实际代码又大又复杂。但我认为这无关紧要,因为调用了“NEXT2”。与往常一样,魔鬼在细节上,但该代码是我以清晰的方式说明我的问题的最佳意图。
标签: android multithreading rx-java