Firebase / Android - 等待所有线程完成回复

时间:2017-06-28 02:17:39

标签: android multithreading firebase response wait

我有以下代码:

public synchronized void next(final RoomListQueryResultHandler handler) {
    this.setLoading(true);

    roomList = new ArrayList<Room>();
    this.database.child("members").child(this.mUser.getUid()).child("rooms")
            .limitToFirst(this.mLimit)
            .startAt(this.currentPage * this.mLimit)
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    RoomListQuery.this.setLoading(false);
                    //mListAdapter.setLoading(false);

                    if (!dataSnapshot.hasChildren()) {
                        RoomListQuery.this.currentPage--;
                    }
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        Room room = ds.getValue(Room.class);
                        //roomList.add(Room.upsert(room));
                        Room.getRoom(room.getId(), new Room.RoomGetHandler() {
                            @Override
                            public void onResult(Room room, customException e) {
                                if (e != null) {
                                    // Error!
                                    e.printStackTrace();
                                    return;
                                }

                                roomList.add(room);
                            }
                        });
                        handler.onResult(roomList, (customException) null);
                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    handler.onResult((List) null, new customException(databaseError.toString()));
                }
            });
     }
}

如果他们看到了,我有两个处理程序,首先我从Firebase中调用一个“房间”列表,然后对于每个处理程序我在其他查询中获取详细信息。

问题是响应是一个空列表,因为函数不等待为房间执行所有查询细节,所以变量roomList总是返回空。

知道我可以实现什么,或者用什么方法来解决它?

非常感谢! 问候。

1 个答案:

答案 0 :(得分:1)

根据应用程序的结构方式,您可能希望更改数据库设计,以便不需要为从第一个查询中检索到的每个房间执行其他Firebase查询。

#start bye dear #end
#start my world #end
#start hello there  #end

如果您要创建列表视图,其中每行都来自//mListAdapter.setLoading(false); Firebase节点,那么显示该列表所需的最小房间属性是多少?如果它只是一些东西,如房间名称,照片网址,所有者,room_id等,您可能最好复制原始来源的那些。然后单击其中一行可以触发/members/<user_id>/rooms中的原始附加 Firebase查询,导航到新屏幕/显示一个模式,其中包含检索后的完整房间详细信息。< / p>

<强>更新

为了解决关于需要额外数据的评论,在这种情况下,作为Room.getRoom(room.getId(), new Room.RoomGetHandler() { ... });类的一部分,我将包括一个额外的布尔值Room,最初设置为false。因此,为了在列表中呈现房间,当_loadedDetails当前为假时,只显示加载微调器。这样,您仍然可以执行这些其他查询,完成后,根据索引更新_loadedDetails内的相应Room对象。像这样:

roomList