Java中的Firebase完成回调

时间:2017-10-01 22:20:01

标签: android multithreading firebase firebase-realtime-database

我想通过databaseReference.child("someChild").setValue(someObject)在RealtimeDatabase中保存数据。 对于我的项目,我需要等待进一步的程序,直到整个写入过程完成。 Documentation建议CompletionListener。但有没有办法等到这个Listener被解雇并完成它的工作?

我尝试了各种方法,例如CountDownLatch.await()synchronizedThread.join(),但这些方法都没有成为正确的解决方案。问题是,像CountDownLatch.await()之类的东西阻挡了监听器,因此听众无法被解雇。这当然会导致整个过程停滞不前。

这个问题有不同的简单方法吗?

我基本上已经编写了代码

databaseReference.child("someChild).setValue(someObject, 
new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
        System.out.println("This should be 1st.");
    }
});
System.out.println("This should be 2nd.");

输出应该是正确的顺序,但实际上它看起来像这样:

输出:

System.out: This should be 2nd.
System.out: This should be 1st.

我希望,有人在这里可以帮助我。

修改

我最初的计划是这样的:

public static void saveThis(SomeObject someObject) {

databaseReference.child("someChild).setValue(someObject, 
new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, 
DatabaseReference databaseReference) {
        System.out.println("This should be 1st.");
    }
});
System.out.println("This should be 2nd.");
}

关键是,我想从任何地方调用saveThis(someObject) - 方法。 有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为onComplete()方法的异步行为甚至被称为bebore,正在尝试打印This should be 1st.。这就是您在logcat中获取该订单的原因。有两种方法可以解决这个问题。

  1. 您需要实现的所有内容都必须放在onComplete()方法中。这意味着如果您想使用列表,例如,声明和使用必须在内部完成。

  2. 如果您想在该方法之外使用某些值,请查看我的答案postonComplete()onDataChange()的行为相同。