android - Firebase从datasnapshot返回null值为什么?

时间:2017-07-15 17:37:58

标签: android firebase firebase-realtime-database

我对以下代码剪断了一些问题:

mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void  onDataChange(DataSnapshot dataSnapshot) {
        size = (int) dataSnapshot.getChildrenCount();   
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});
viewHolder.setCount(size);

大小返回null但我不明白为什么。我想将计数值传递给recyclerview。

1 个答案:

答案 0 :(得分:1)

数据是从Firebase异步加载的。这意味着您的代码执行顺序不是您可能期望的。您可以通过在代码中添加一些日志语句来轻松地看到这一点:

System.out.println("Before addListenerForSingleValueEvent");
mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void  onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("In onDataChange");
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});
System.out.println("After addListenerForSingleValueEvent");

这个输出是:

  

在addListenerForSingleValueEvent之前

     

addListenerForSingleValueEvent

之后      

在onDataChange

这可能不是你所期望的!数据是从Firebase异步加载的。而不是等待它返回(这将导致“应用程序无响应”对话框),该方法继续。然后,当数据可用时,将调用onDataChange

要使程序正常运行,您需要将需要数据的代码移动到 onDataChange方法中:

mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void  onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("size ="+dataSnapshot.getChildrenCount());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});