【发布时间】:2016-07-20 08:16:25
【问题描述】:
我无法知道我的 Firebase API 调用何时完成。看完Firebase documentation我发现如下:
值事件总是最后触发,并保证包含在拍摄快照之前发生的任何其他事件的更新。
我理解这意味着只有在所有 onChildAdded 调用完成后,才会调用 ValueEventListener。结果,我认为我可以在onChildAdded 函数中填充我的RecyclerView,然后在onSingleValueListener 调用中填充,我可以简单地完成加载屏幕的动画(在此函数调用之前已经开始动画)并继续。但是,我遇到了一个问题,我仔细地添加了System.out.println 语句,发现在我的情况下,Test 1 在调用Test 2 之前被调用。这会导致问题,因为这实际上与我想要的行为相反:我希望 onChildAdded 函数完成,然后调用打印出 Test 1 的 onSingleValueListener 函数以被调用。发生这种情况有什么原因吗?有什么办法吗?我希望能解释为什么会发生这种情况。谢谢!
public void getComments(final String postId, final Activity activity, final View fragmentView, final View progressOverlay) {
final Firebase commentsRef = firebaseRef.child("/comments");
Firebase linkRef = firebaseRef.child("/posts/" + postId);
linkRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("Test 1");
if (progressOverlay.getVisibility() == View.VISIBLE) {
progressOverlay.setVisibility(View.GONE);
AndroidUtils.animateView(progressOverlay, View.GONE, 0, 200);
fragmentView.findViewById(R.id.rv_view_comments).setVisibility(View.VISIBLE);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
linkRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
commentsRef.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Comment comment = dataSnapshot.getValue(Comment.class);
System.out.println("Test 2");
application.getCommentsRecyclerViewAdapter().getCommentsList().add(comment);
application.getCommentsRecyclerViewAdapter().notifyDataSetChanged();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
【问题讨论】:
-
"Firebase linkRef = firebaseRef.child("/posts/" + postId);"我认为您使用的是旧版 Firebase API;我说的对吗?
-
参考此文档并在新的 Firebase 数据库 API 中试用; "firebase.google.com/docs/database/android/start";
标签: android asynchronous firebase firebase-realtime-database