Android Studio Firebase查询-从回调函数检索值并将其分配给变量

时间:2019-11-28 15:59:21

标签: android firebase google-cloud-firestore

我是一个初学者,所以为可能出现的愚蠢问题表示歉意。

我正在尝试从Firebase数据库检索数据。这行得通,但我无法将值分配给字符串变量以供以后使用。

这是对数据库的异步调用,它返回正确的结果。 (其查询的数据是静态的,因此我确实不需要异步调用,但据我所知,我没有其他选择)。

 public static void getAnimalDetails(String strColl, final String strQueryField, final String strQueryValue,
                                         final MyCallBack myCallback){

        mfirebaseDb.collection(strColl)
                .whereEqualTo(strQueryField, strQueryValue)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {

                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if(task.isSuccessful()) {

                            for (QueryDocumentSnapshot document : task.getResult()) {

                                    String strResult = document.get("animal_class").toString();
                                    Log.d(TAG, "SSSS:" + strResult );
                                    myCallback.onCallback(strResult);

                            }



                        }
                    }
                });

    }

这是传递给上述方法的回调函数。

    public interface MyCallBack {
        void onCallback(String strValFromAsyncTask);
    }

然后在这里我调用asynch任务并尝试从回调中访问数据。 单击按钮时触发此方法 我可以通过日志看到在strAnimalClass(这是一个全局变量)中填充了正确的值 但是,当我尝试在回叫之外使用strAnimalClass时,它为null。

        getAnimalDetails("animals", "animal_common_name", animal, new MyCallBack() {
            @Override
            public void onCallback(String strValFromAsyncTask) {

                strAnimalClass = strValFromAsyncTask;
                Log.d(TAG, "mmmmm:" + strAnimalClass );
            }
        });

任何人都可以帮助如何从异步/回调环境中获取类似的值以供以后使用吗? 谢谢

1 个答案:

答案 0 :(得分:0)

您不能在回调之外使用该值。更具体地说,您可以 在回调之外使用值,但不能在调用回调之前使用。此规则适用于Firebase的onComplete 和自定义onCallback方法。

您可以通过几行日志来验证:

Log.d(TAG, "Before calling getAnimalDetails")
getAnimalDetails("animals", "animal_common_name", animal, new MyCallBack() {
    @Override
    public void onCallback(String strValFromAsyncTask) {
        Log.d(TAG, "Inside onCallback");
    }
});
Log.d(TAG, "After calling getAnimalDetails")

运行此代码时,它将记录:

  

在调用getAnimalDetails之前

     

调用getAnimalDetails后

     

在getAnimalDetails内部

因此,尽管您可以在调用strAnimalClass的代码之后访问getAnimalDetails,但由于尚未调用onCallback,因此它还没有预期的值。

因此,任何需要数据库中的值的代码都必须位于onCompleteonCallback内部,或在其中调用。

另请参阅: