Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase嵌套循环等待完成_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android Firebase嵌套循环等待完成

Android Firebase嵌套循环等待完成,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我有嵌套循环,类似于: ... @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot d : dataSnapshot.getChildren()){ ... @Override public void onDataChange(DataSnapshot dataSnapshot) { write

我有嵌套循环,类似于:

...
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

     for(DataSnapshot d : dataSnapshot.getChildren()){

         ...
         @Override
         public void onDataChange(DataSnapshot dataSnapshot) {
             writeMessage("hello");
         }
         @Override
         public void onCancelled(DatabaseError databaseError) {
         }

     }


     writeMessage("bye");


}
@Override
public void onCancelled(DatabaseError databaseError) {
}
我希望for循环完成并打印“hello”5次(例如),然后才打印!继续并打印“再见”消息。 我试图搜索类似的主题,但找不到任何关于如何实现它的答案,希望您能帮助我


谢谢

问题在于每个
DataSnapshot
都在一个线程上运行,例如:如果
DataSnapshot.getChildren()
等于5,那么您创建的嵌套循环将生成6个线程:一个用于外部
onDataChange()
而另一个用于内部
onDataChange()
。所以,如果您想在最后一行打印“bye”,您应该同步计算内部
onDataChange()
。下面的代码尚未测试

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
     count = 0;
     final int target = number_of_children_in_dataSnapshot;
     for(DataSnapshot d : dataSnapshot.getChildren()){

         ...
         @Override
         public void onDataChange(DataSnapshot dataSnapshot) {
             writeMessage("hello", target);
         }
         @Override
         public void onCancelled(DatabaseError databaseError) {
         }

     }
}
@Override
public void onCancelled(DatabaseError databaseError) {
}

Integer count = 0;
private synchronized void writeMessage(String message, int target) {
    count++;
    if (count == target) {
        // do write bye
        return;
    }
    // do write message
}

显然类似于此:在onDataChange中,如果计数器==5(例如),则写消息(“bye”);虽然没有看到真正的嵌套循环,但我看到了一个循环。可能在
onDataChange
之前,您是否为侦听器签名?因此,只有当数据发生实际更改时才会调用该函数。所以要么移动
writeMessage(“hello”)
onDataChange
方法之外,或者显示更多的codeSelvin的方法可能是您想要的。但除此之外:除非你真的发布了一个真实的答案,否则很难给你有用的代码作为答案。现在,无法理解内部的
onDataChange()
和外部的
onDataChange()
是如何关联的(因此如何确定循环的退出条件)。谢谢,我希望将来firebase会给我们提供跟踪查询完成的选项