知道Firebase何时完成API调用?

时间:2016-07-20 08:16:26

标签: android asynchronous firebase firebase-realtime-database

我在了解Firebase API调用完成时遇到了一些问题。阅读Firebase documentation后,我发现了以下内容:

  

值事件总是最后触发,并且保证包含在拍摄快照之前发生的任何其他事件的更新。

我理解这意味着只有在完成所有onChildAdded调用之后,才会调用ValueEventListener。结果,我认为我可以在RecyclerView函数中填充我的onChildAdded,然后填充onSingleValueListener调用,我可以简单地完成动画我的加载屏幕(在此功能之前已开始制作动画)打电话)并继续。但是,我遇到了一个问题,我在其中放了一些谨慎的System.out.println语句,发现在我的情况下,Test 1在调用Test 2之前被调用。这会导致问题,因为这实际上是我想要的相反行为:我希望onChildAdded函数完成,然后调用打印出onSingleValueListener的{​​{1}}函数进行调用。这有什么原因吗?有什么方法吗?我很感激为什么会发生这种情况的解释。谢谢!

Test 1

2 个答案:

答案 0 :(得分:4)

使用此代码"Firebase linkRef = firebaseRef.child("/posts/" + postId);",我可以看到您正在使用旧版Firebase API。 现已弃用!

请将您的代码更新为新的Firebase 3.x.x API。

以下两个是独立的异步调用;根据您的用例,您可以使用其中一个侦听器来读取数据。

1. linkRef.addListenerForSingleValueEvent(new ValueEventListener() {});
2. linkRef.addChildEventListener(new ChildEventListener() {});

您可以参考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
        }
    });

希望这会对你有帮助!

答案 1 :(得分:4)

您可能希望使用Firebase团队在FirebaseUI-Android中提供的**FirebaseRecyclerAdapter**课程(请参阅https://github.com/firebase/FirebaseUI-Android/blob/master/database/src/main/java/com/firebase/ui/database/FirebaseRecyclerAdapter.java

在您的gradle文件中添加以下行(请在自述文件中查看here以获取最新版本号)     编译' com.firebaseui:firebase-ui-database:0.4.3'