use*_*869 11 android asynchronous firebase firebase-realtime-database
知道我的Firebase API调用何时完成,我遇到了一些麻烦.看完后Firebase documentation我发现了以下内容:
值事件始终最后触发,并保证包含在拍摄快照之前发生的任何其他事件的更新.
我理解这意味着只有在onChildAdded完成所有调用之后,ValueEventListener才会调用它.结果,我认为我可以填充我RecyclerView的onChildAdded函数然后onSingleValueListener调用,我可以简单地完成动画我的加载屏幕(在此函数调用之前已开始动画)并继续.但是,我遇到了一个问题,我在其中System.out.println发表了一些细致的陈述,发现在我的情况下,Test 1之前Test 2被调用过.这会导致问题,因为这实际上是我想要的相反行为:我希望onChildAdded函数完成,然后调用onSingleValueListener打印出来的函数Test 1进行调用.有什么理由发生这种情况吗?有什么方法吗?我很感激为什么会发生这种情况的解释.谢谢!
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) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
您可能希望使用**FirebaseRecyclerAdapter**Firebase 团队在 FirebaseUI-Android 中提供的类(请参阅https://github.com/firebase/FirebaseUI-Android/blob/master/database/src/main/java/com/firebase/ui /database/FirebaseRecyclerAdapter.java )
在您的 gradle 文件中添加以下行(请在此处查看自述文件中的最新版本号)编译 'com.firebaseui:firebase-ui-database:0.4.3'
通过这段代码,"Firebase linkRef = firebaseRef.child("/posts/" + postId);"我可以看到您正在使用旧版 Firebase API。现在已弃用!
请将您的代码更新到新的 Firebase 3.xx API。
下面两个是独立的异步调用;根据您的用例,您可以使用任一侦听器来读取数据。
1. linkRef.addListenerForSingleValueEvent(new ValueEventListener() {});
2. linkRef.addChildEventListener(new ChildEventListener() {});
Run Code Online (Sandbox Code Playgroud)
您可以参考firebase文档来获取有关数据库监听器的更多信息。 https://firebase.google.com/docs/database/android/retrieve-data
使用以下代码片段,您可以检索并填充评论列表。
public void getComments(final String postId, final Activity activity, final View fragmentView, final View progressOverlay) {
DatabaseReference commentsRef = firebaseRef.child("/comments");
DatabaseReference linkRef = commentsRef.child("/posts/" + postId);
linkRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Iterate through data-snapshot, and update your Adapter dataset
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Comment comment = snapshot.getValue(Comment.class);
application.getCommentsRecyclerViewAdapter().getCommentsList().add(comment);
}
application.getCommentsRecyclerViewAdapter().notifyDataSetChanged();
// Dismiss your loading progressbar
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(DatabaseError databaseError) {
// Handle fail case here
}
});
Run Code Online (Sandbox Code Playgroud)
希望这会对您有所帮助!
| 归档时间: |
|
| 查看次数: |
2065 次 |
| 最近记录: |