我是一个初学者,所以为可能出现的愚蠢问题表示歉意。
我正在尝试从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 );
}
});
任何人都可以帮助如何从异步/回调环境中获取类似的值以供以后使用吗? 谢谢
答案 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
,因此它还没有预期的值。
因此,任何需要数据库中的值的代码都必须位于onComplete
或onCallback
内部,或在其中调用。
另请参阅: