当我尝试等待 Firebase OnSuccessListener 完成时,它超时了

问题描述 投票:0回答:1

我正在尝试从我的 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 将为空,因为它没有及时加载。

java firebase asynchronous google-cloud-firestore
1个回答
0
投票

您无法将

returnData
对象作为方法的结果返回。请记住,Firebase API 是异步的。这意味着解决方案始终相同。任何需要 Cloud Firestore 数据库中的数据的代码都需要位于
onSuccess
方法内或从那里调用。因此,在您的情况下,
returnData
对象的值应仅在
onSuccess
方法内使用。

或者,如果您需要等待数据,那么您可以使用回调,如我在以下帖子中的回答中所述:

或者您可以使用

LiveData
对象,如以下答案中所述:

或者如果您了解 Kotlin,您也可以使用 Kotlin Coroutines,如下所述:

© www.soinside.com 2019 - 2024. All rights reserved.