我目前正在尝试将数据保存到Firebase实时数据库。我只想用
保存数据databaseReference.child("someChild").setValue(someObject);
Thread.sleep(1000);
这只是工作正常。对象出现在控制台中,一切正常。但我想知道是否有更顺畅的实现,所以我尝试使用OnCompleteListener
并制定了以下代码:
final AtomicBoolean done = new AtomicBoolean(false);
databaseReference.child("someChild")
.setValue(someObject)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
System.out.println("completed");
done.set(true);
}
});
while (!done.get());
同样,数据已成功写入数据库,但onCompleteListener
根本没有被调用,因此while
- 循环不会被中断。
为什么没有收听监听器?我也做了其他设置(没有while
- 循环),但那些也没有。
提前致谢。
答案 0 :(得分:0)
根据我的经验,紧密循环(您拥有的while
循环)将阻止主线程并阻止Firebase调用onComplete
(这也发生在主线程上。
要防止阻止,请使用postDelayed
:
final AtomicBoolean done = new AtomicBoolean(false);
databaseReference.child("someChild")
.setValue(someObject)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
System.out.println("completed");
done.set(true);
}
});
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (done.get()) {
... Do the thing that requires the data
}
}
}, 1000);
另请参阅我的答案Google API's credentials