【发布时间】:2020-11-27 06:09:05
【问题描述】:
我是在 Android Java 中进行异步编程的新手。我想知道是否有办法在初始回调函数完成后运行另一个回调。现在,我认为它们是并行运行的,尽管第二个依赖于第一个。
第一次回调:
// GETTING USER
private interface FirestoreUserCallback {
void onCallback (User myUser);
}
private void getUser(final FirestoreUserCallback firestoreCallback) {
Task<DocumentSnapshot> task = fStore.collection("users").document(fAuth.getCurrentUser().getUid()).get();
task.addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
user = documentSnapshot.toObject(User.class);
firestoreCallback.onCallback(user);
Log.d(TAG, "user created");
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "user creation failed");
}
});
}
第二次回调:
// GETTING ALL DOCUMENTS
private interface FirestoreDocumentCallback {
void onCallback (List<TableEntries> myEntries);
}
private void getDocuments (final FirestoreDocumentCallback firestoreDocumentCallback) {
fStore.collection("result")
.document(Integer.toString(user.getCompanyNumber())) // need to use User object returned from the first Callback
.collection("SAM").get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
List<TableEntries> results = new ArrayList<>();
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
// add objects to results ArrayList ...
Log.d(TAG, document.getId() + " => " + document.getData());
}
firestoreDocumentCallback.onCallback(results);
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
}
创建:
getUser(new FirestoreUserCallback () {
@Override
public void onCallback(User myUser) {
user = myUser;
}
});
getDocuments(new FirestoreDocumentCallback() {
@Override
public void onCallback(List<TableEntries> myEntries) {
entries = myEntries;
}
});
getDocuments() 依赖于从第一个回调中获得其值的用户变量。我收到此错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
【问题讨论】:
-
当您链接回调时,首先要记住的是您将遇到“回调地狱”的情况。那是题外话,但对您的问题的回答是,如果您依赖于完成第一个操作来开始第二个操作,那么您应该在第一个操作的回调中编写第二个操作。
-
在您的情况下,您应该从
getUsers的覆盖方法onCallback调用getDocuments方法,在该方法中您从回调接收用户对象。 -
感谢您的回答!本质上,我应该将
getDocuments()移动到user = myUser下方? -
是的,这将解决您的问题,检查一下
标签: java android firebase asynchronous google-cloud-firestore