如何同步读取Firebase实时数据库值?

时间:2018-10-05 08:52:36

标签: android firebase firebase-realtime-database

我正在使用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是否有类似上述的同步替代方案?

2 个答案:

答案 0 :(得分:1)

尝试从异步的API同步返回值,这不是一个好主意。但是,如果您的块已经与主线程异步-您可以使用CountDownLatchawait回调响应。

示例:

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

如果有任何更正,请在评论中告知:)