我对以下代码剪断了一些问题:
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。
答案 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
}
});