如前所述,您可以使用Firebase 任务 API https://developers.google.com/android/reference/com/google/android/gms/tasks/package-summary提出于2016 年谷歌 I/O 大会 https://www.youtube.com/watch?v=AJqakuas_6g.
Task<?>[] tasks = new Task[] {
saveUserName(username),
saveFriends(friends),
saveOtherStuff(stuff)
};
Tasks.whenAll(tasks)
.continueWithTask(new RollbackIfFailure())
.addOnCompleteListener(this)
.addOnFailureListener(this);
如果进行修改的每个步骤都可以并行运行,则可以创建一个返回Task https://developers.google.com/android/reference/com/google/android/gms/tasks/Task对于其中每一个如下:
public Task<String> saveUserName(final String username) {
final TaskCompletionSource<String> tcs = new TaskCompletionSource<>();
mDatabase.child("users")
.child(username)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String username = dataSnapshot.getValue(String.class);
if (null == username) {
tcs.setResult(null);
} else {
tcs.setException(new IllegalStateException(username));
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
tcs.setException(new IOException(TAG, firebaseError.toException()));
}
});
return tcs.getTask();
}
如果其中任何一个失败,您需要回滚操作。由于这可能受到单个任务的威胁,因此您可以创建一个Continuation https://developers.google.com/android/reference/com/google/android/gms/tasks/Continuation task:
class RollbackIfFailure implements Continuation<Void, Task<Void>> {
@Override
public Task<Void> then(@NonNull Task<Void> task) throws Exception {
final TaskCompletionSource<Void> tcs = new TaskCompletionSource<>();
if (task.isSuccessful()) {
tcs.setResult(null);
} else {
// Rollback everything
}
return tcs.getTask();
}
}