Java 等待所有异步方法完成

Java 等待所有异步方法完成,java,android,firebase,firebase-realtime-database,java-threads,Java,Android,Firebase,Firebase Realtime Database,Java Threads,我编写的方法包含两个异步方法,用于创建与firebase的连接。我想在所有异步方法完成后完成该方法。我该怎么做? 若它是一个异步方法,那个么我创建了回调接口,但在这种情况下并没有帮助 例如: public void method(String teamID1,String teamID2) { final ArrayList<String> usersID = new ArrayList<>(); final DatabaseReference mDa

我编写的方法包含两个异步方法,用于创建与firebase的连接。我想在所有异步方法完成后完成该方法。我该怎么做? 若它是一个异步方法,那个么我创建了回调接口,但在这种情况下并没有帮助

例如:

 public void method(String teamID1,String teamID2)
{
    final ArrayList<String> usersID = new ArrayList<>();

    final DatabaseReference mDatabase1 =  getDatabaseReference(ConstantNames.ROLE_PATH).child ( teamID1 );
    mDatabase1.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            usersID.add(snapshot.getValue().toString());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });

    final DatabaseReference mDatabase2 =  getDatabaseReference(ConstantNames.ROLE_PATH).child ( 2 );
    mDatabase2.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            usersID.add(snapshot.getValue().toString());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
}
public void方法(字符串teamID1,字符串teamID2)
{
final ArrayList usersID=new ArrayList();
final DatabaseReference mDatabase1=getDatabaseReference(ConstantNames.ROLE_PATH).child(teamID1);
mDatabase1.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
usersID.add(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
final DatabaseReference mDatabase2=getDatabaseReference(ConstantNames.ROLE_PATH).child(2);
mDatabase2.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
usersID.add(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}
(此方法仅用于说明)

我希望在调用mDatabase1和mDatabase2的侦听器时完成此方法。
如何操作?

我建议为此使用全新的
get()
方法。此方法的作用与添加ListenerForSingleValueEvent的作用几乎相同,但:

  • 它修复了可能从磁盘缓存返回过时数据的争用条件
  • 它返回一个
    任务
最后一位与您相关,因为它允许您在此处对两个数据库调用的任务使用
Tasks.whenAll()

另见:

  • ,例如新的
    get()
    API与
    addListenerForSingleValueEvent
    API的比较
  • 有关的参考文档
  • 有关使用
    Tasks.whenAll()
    的示例

非常感谢您!这对我有用!