我想通过databaseReference.child("someChild").setValue(someObject)
在RealtimeDatabase中保存数据。
对于我的项目,我需要等待进一步的程序,直到整个写入过程完成。
Documentation建议CompletionListener
。但有没有办法等到这个Listener被解雇并完成它的工作?
我尝试了各种方法,例如CountDownLatch.await()
,synchronized
和Thread.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)
- 方法。
有没有办法做到这一点?
答案 0 :(得分:1)
这种情况正在发生,因为onComplete()
方法的异步行为甚至被称为bebore,正在尝试打印This should be 1st.
。这就是您在logcat中获取该订单的原因。有两种方法可以解决这个问题。
您需要实现的所有内容都必须放在onComplete()
方法中。这意味着如果您想使用列表,例如,声明和使用必须在内部完成。
如果您想在该方法之外使用某些值,请查看我的答案post。 onComplete()
与onDataChange()
的行为相同。