我有这种方法,我执行2个查询将数据放入2个列表,之后,我想验证列表的大小(用于调试目的)。
方法:
postList = new ArrayList<>();
Query query = postRef.orderByChild("timestamp");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int k = 0;
for (DataSnapshot ds : dataSnapshot.getChildren()){
postList.add(ds.getValue(Post.class));
Log.d("Display All Posts", postList.get(k).getTime());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
followingList = new ArrayList<>();
userRef.child(userId).child("following").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int k = 0;
for (DataSnapshot ds: dataSnapshot.getChildren()){
Log.d("Following", "New user found:" + ds.getValue());
followingList.add(ds.getValue(String.class));
Log.d("FollowingList value", followingList.get(k));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Log.d("b1 and b2 ", "this is happening");
Log.d("Post Size", String.valueOf(postList.size()));
Log.d("following size", String.valueOf(followingList.size()));
}
我确定红色框中的代码首先发生,然后是绿色箭头指向的查询,最后是黄线指向的查询。
问题
如何使框中的指令最后执行?
PS:我已经尝试将它放在另一个方法中,然后调用该方法,结果相同。
答案 0 :(得分:6)
表现如预期。 ValueEventListener.onDataChange
是一个异步调用,将在其他某个时间点执行。它不会按顺序执行,因为您希望首先打印日志。将这些日志移到onDataChange
以确保根据您的需要执行。