我编写了一个包含两个异步方法的方法,用于创建与firebase的连接。我想在所有异步方法完成后完成方法。我该怎么做呢?如果它是一个异步方法,那么它将创建callBack接口,但在这种情况下没有帮助。
例如:
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) {
}
});
}
(这个方法只是为了说明)
我想在mDatabase1的监听器和mDatabase2的监听器调用时完成这个方法。我该怎么做呢?
我建议使用全新的get()
方法。该方法的作用与addListenerForSingleValueEvent
几乎相同,但是:
- 它修复了一个可能从磁盘缓存返回过时数据的竞争条件。
- 返回
Task<DataSnapshot>
。
最后一位与您相关,因为它允许您在这里的两个数据库调用的任务上使用Tasks.whenAll()
。
也看到:
- get()和addListenerForSingleValueEvent之间的区别是什么?,例如新的
get()
API与addListenerForSingleValueEvent
API的对比 Tasks.whenAll
的参考文档。- 成为Firebase任务管理员!(第4部分:多任务处理),以获取使用
Tasks.whenAll()
的示例。