使用以下模式从Firebase实时数据库同步获取数据时:
String s = Single.create(new SingleOnSubscribe<String>() {
@Override
public void subscribe(SingleEmitter<String> e) throws Exception {
FirebaseDatabase.getInstance().getReference("path").orderByChild("child").equalTo("xyz").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
e.onSuccess("Got it");
}
@Override
public void onCancelled(DatabaseError databaseError) {
e.onError(databaseError.toException());
}
});
}
}).blockingGet();
如果我在 Single 内部使用相同的 Firebase "内部",它会挂起并创建 ANR 错误。但是,如果我在 Single 外部使用相同的 Firebase "内部",它就可以正常触发。同时,没有 Firebase 代码的 Single 也可以触发,因此似乎两者之间存在一些不兼容性。
有什么想法吗?
blockingGet
仍在执行并仍在阻止主线程,从而防止 firebase 事件回调的执行。 - akarnokdaddListenerForSingleValueEvent
,在 UI 线程上使用blockingGet
将始终导致死锁。要么摆脱阻塞,要么从非 UI 线程调用问题中提出的所有代码。 - m.ostroverkhov