如何使用Firestore onSnapshotListener上的任务链接实时更新?

时间:2018-05-17 18:02:29

标签: android firebase task google-cloud-firestore

我可以使用Tasks将Firestore get()命令链接在一起,但是我想使用Firestore的onSnapshotListener进行相同操作,这样我就可以将实时更新链接在一起。

以下是我用来链接多个获得奖励的代码示例:

Query usersQuery = mDbase.collection("admins").document(adminID).collection("users");
Query booksQuery = mDbase.collection("books").whereEqualTo("groupID", groupID);
DocumentReference adminDoc = mDbase.collection("admins").document(adminID);

final Task<QuerySnapshot> getUsers = usersQuery.get();
final Task<QuerySnapshot> getBooks = booksQuery.get();
final Task<DocumentSnapshot> getAdmin = adminDoc.get();

Tasks.whenAllSuccess(getUsers, getBooks, getAdmin)
        .addOnCompleteListener(new OnCompleteListener<List<Object>>() {
            @Override
            public void onComplete(@NonNull Task<List<Object>> task) {
                List<User> users = getUsers.getResult().toObjects(User.class);
                List<Book> books = getBooks.getResult().toObjects(Book.class);
                Admin admin = getAdmin.getResult().toObject(Admin.class);

                // ...
            }
        }); 

我的目标如下:“(我)想要将三个单独的快照侦听器视为单个”流“,并且每当在其中任何一个中触发事件时,(I)希望获得具有最新值的更新所有这三个。”报价和示例代码由Sam Stern在Google Firestore论坛中提供。

出于我的目的,听起来我需要实时更新。

这是我的嵌套快照代码:

firebaseGetUsers.readDataRTUpdate(new FirebaseGetUsers.FirestoreCallback() {
        @Override
        public void onCallback(final List<User> users) {
            firebaseGetBooks.readDataRTUpdate(new FirebaseGetBooks.FirestoreCallback() {
                @Override
                public void onCallback(final List<Book> books) {
                    firebaseGetThisAdmin.readDataRTUpdate(new FirebaseGetThisAdmin.FirestoreCallback() {
                        @Override
                        public void onCallback(Admin admin) {
                            //processing all code here.
                            //books are empty!!
                            System.out.println("books: " + books.toString());
                            }
                        }
                    });
                }
            });
        }
    }); 

感谢。

1 个答案:

答案 0 :(得分:0)

您所询问的内容对于快照侦听器来说并不可行。任务表示最终以最终结果或某些错误完成的工作单元。它们不适合正在进行的工作或流数据,因为从来没有一个最终的结果。相反,您注册一个为每个更新调用的侦听器,该更新仅在您选择停止它时停止。所以,无论你想做什么,你都必须编写管理监听器而不是任务的代码。