我正在使用Firebase实时数据库,据我所知,您必须使用
DatabaseReference.addValueEventListener
从firebase数据库中读取一个值。
addValueEventListener
在默认情况下是异步的。我需要同步阅读。对于FireBase存储,对于上传文件时的相同问题,我可以使用
UploadTask.TaskSnapshot await = Tasks.await(uploadTask);
代替使用
uploadTask.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
}
})
addValueEventListener
是否有类似上述的同步替代方案?
答案 0 :(得分:1)
尝试从异步的API同步返回值,这不是一个好主意。但是,如果您的块已经与主线程异步-您可以使用CountDownLatch
和await
回调响应。
示例:
CountDownLatch latch = new CountDownLatch(1);
uploadTask.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>(){
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
//Handle response
latch.countDown();
}
});
latch.await();
答案 1 :(得分:0)
大多数firebase方法返回Task <>的实例。因此,我们可以轻松地在非主线程中等待它们以获取结果就位(而不是实现onCompleteListener并运行到“回调地狱”中)。
但是我没有找到一种getValue类型的方法来返回Task。我发现问题的评论中提到了this个博客文章。完成之后,我为自己编写了一个getValue扩展函数。
app_name.005_xyz
如果有任何更正,请在评论中告知:)