因此,我有一个Firebase实时数据库,该数据库有一个孩子,在其下有孩子。 我想遍历子项并将子项的键添加到列表中。
这就是我在做什么:
public ArrayList<String> debateKeys() {
debatesChildren.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
tempItems.add(postSnapshot.getKey());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return tempItems;
}
当我使用调试器时,它表明tempItems
不返回任何内容,并且onDataChange
甚至没有执行,这意味着它甚至没有运行for循环。
如何浏览孩子的孩子并将他们的钥匙添加到列表中?
答案 0 :(得分:4)
addValueEventListener()是异步的,并立即返回。传递给它的侦听器将在一段时间后最终知道结果时被调用。这意味着您将返回最初为空的templates
。如果并且在函数返回后的某个不可预知的时间更新内容时,坚持使用templates
的人可能会感到惊讶。不仅如此,随着您的收听者每次对debatesChildren
所代表的位置进行每次更改时,内容都会随着时间的推移而不断变化。这是一个非常糟糕的情况。
首先,如果只需要访问一次数据,则应使用addListenerForSingleValueEvent()以确保您的侦听器仅被调用一次。
第二,您不应尝试将类似的异步调用转换为同步调用。代码的其他部分需要数据库查询的结果,它们应该通过回调而不是通过函数返回值来接收该结果。您将必须弄清楚如何在应用中进行异步编程,并根据需要进行连接。