在下面的代码中,我得到了孩子的数量,但是我想在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) {
}
});
有人可以帮助我吗?
答案 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