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

android-Firebase从datasnapshot返回空值为什么?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我正在使用以下代码进行一些兜售: mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { size = (int) dataSnapshot.getChildrenCount(); } @Override

我正在使用以下代码进行一些兜售:

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);

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

数据是从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之后

在Ondata变化中

这可能不是你所期望的!数据是从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
    }
});

发布您的数据库结构,我想返回的是mCevap isHere的“大小”。但你一直在变为零。如果我用“Toast”打印它,它会正常反映。我如何将它传输到TextView(也可以在RecycleView中找到)。