java - 一个接一个地执行回调
问题描述
我是在 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
解决方案
回调看起来不错。您只需要在访问它之前检查您的值是否为空。只需添加一个空检查
if(doubleValue!=null)
推荐阅读
- javascript - Nodemailer 和 HTML 模板 - 遍历数组中的项目
- powershell - 程序“coverlet.exe”运行失败:文件名或扩展名太长在 D:\a\1\s\pipeline.ps1:15 char:1
- android - 无法通过内置应用程序 Ionic 4 建立 API 连接
- c++ - 尝试做一个简单的结构数组c ++
- c# - 如果 Dropdownlist SelectedIndex = 0 则不在 SQL 数据库中添加任何行
- c++ - glTexImage2D 崩溃程序
- curl - curl:(26)无法打开文件“/C/Users/sekim/Downloads/Letter to Mama Vincent.pdf”
- javascript - 默认情况已经定义?
- powershell - 从传递参数的外部程序调用 Powershell 脚本
- python - 在 Python 中对不同字典中的值进行操作