【问题标题】:OnCompleteListener is not called for .setValue in RealtimeDatabase实时数据库中的 .set 值不调用 OnCompleteListener
【发布时间】:2018-03-12 19:00:23
【问题描述】:

我目前正在尝试将数据保存到 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循环没有中断。

为什么不调用 Listener?我也做了其他设置(没有while-loop),但这些也不起作用。

提前致谢。

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    根据我的经验,紧密循环(您拥有的 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);
    

    也可以在这里查看我的答案Setting Singleton property value in Firebase Listener

    【讨论】:

    • 不幸的是,这并没有解决问题。 OnComplete-Listener 仍然没有被调用(如果是,我会在 SystemOutput 中看到它)
    • 如果您删除AtomicBoolean 并努力等待,它会调用onComplete() 吗?如果是这样,很明显您删除的代码阻止了对onComplete() 的调用。
    • 原来,AtomicBoolean 确实是问题所在。感谢您的帮助!
    猜你喜欢
    • 2020-02-19
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多