Firebase嵌套循环等待完成

时间:2016-12-14 22:41:02

标签: android firebase firebase-realtime-database

我有嵌套循环,类似于:

...
@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次(例如)然后才开始!继续并打印“再见”消息。 我试图搜索类似的主题,但找不到任何关于如何实现它的答案,希望你能帮助我。

由于

1 个答案:

答案 0 :(得分:1)

问题是每个DataSnapshot在一个线程上运行,例如:如果dataSnapshot.getChildren()等于5,那么您创建的嵌套循环将生成6个线程:一个用于外部onDataChange()和另一个为5内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
}