我正在尝试从我的 firebase Firestore 数据库加载数据。此代码使用异步运行的 OnSuccessListener,因此我尝试等到它加载数据才能继续。我通过创建一个 while 循环来完成此操作,该循环运行直到 OnSuccess 函数将变量设置为 true。
这是代码
public FragmentData getFragData(String fragType)
{
cont = false;
Log.d("useremail", currentUser.getEmail());
DocumentReference docRef = db.collection("users").document(currentUser.getEmail()).collection("FragmentData").document(fragType);
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
returnData = documentSnapshot.toObject(FragmentData.class);
cont = true;
Log.d("testhi", "" + returnData.getId().get(0));
}
});
while(!cont);
//find a way to fix the fact that onsuccess doesnt process in time so return data is always null
Log.d("testhi", "" + returnData.getId().get(0));
return returnData;
}
当我这样做时,while 循环会阻止 OnSuccess 函数发生,但我想知道为什么,因为 OnSuccess 函数应该与正常函数异步工作。如果没有办法挽救这个问题,我想知道我应该如何解决这个问题,因为如果我不这样做,returnData 将为空,因为它没有及时加载。
您无法将
returnData
对象作为方法的结果返回。请记住,Firebase API 是异步的。这意味着解决方案始终相同。任何需要 Cloud Firestore 数据库中的数据的代码都需要位于 onSuccess
方法内或从那里调用。因此,在您的情况下, returnData
对象的值应仅在 onSuccess
方法内使用。
或者,如果您需要等待数据,那么您可以使用回调,如我在以下帖子中的回答中所述:
或者您可以使用
LiveData
对象,如以下答案中所述:
或者如果您了解 Kotlin,您也可以使用 Kotlin Coroutines,如下所述: