RealtimeDatabase

时间:2017-10-01 13:58:12

标签: java android firebase firebase-realtime-database

我目前正在尝试将数据保存到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 - 循环),但那些也没有。

提前致谢。

1 个答案:

答案 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