如何在dataSnapshot函数之外使用值?

时间:2019-05-23 21:52:06

标签: android firebase firebase-realtime-database

在下面的代码中,我得到了孩子的数量,但是我想在onDataChange方法之外使用它。

              mRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot)
                    {
                        DateStorage dateStorage = null;
                        for (DataSnapshot result : dataSnapshot.getChildren()) 
                    {


                     Log.e(result.getKey(),result.getChildrenCount() + "");
                      in[0] = result.getChildrenCount();

                        }

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

从Firebase异步加载数据。在加载数据时,您的主代码将继续运行,然后在数据可用时,将调用onDataChange方法。如果添加一些日志语句,这最容易看出来:

Log.d("TAG", "Before attaching listener");
mRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {
        Log.d("TAG", "Got data");
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});
Log.d("TAG", "After attaching listener");

运行此代码时,它将记录:

  

在附加侦听器之前

     

附加监听器后

     

获得数据

这可能不是您期望的顺序,但是在调用异步API时是完全正常的。它解释了为什么在onDataChange()之外打印时会得到错误的值。

问题不在于您不能使用onDataChange()之外的数据,而是必须确保onDataChange()在运行 之前已运行。数据。

最简单的方法是将所有需要数据库数据的代码放在onDataChange方法的内部。但是,您也可以创建自己的回调接口,并将其传递给加载数据的方法。有关这两种方法的示例,请在此处查看我的答案:getContactsFromFirebase() method return an empty list