如何从Firestore集合取值存入变量?取值为null该如何解决?
问题根因
Firestore的addSnapshotListener是异步回调逻辑:你触发监听请求后,代码不会等待服务端返回结果,会直接向下执行你初始化storageReference的同步代码。这时候onEvent回调还没触发,year变量还没有被赋值,所以getYear()返回null。
解决方案
把所有需要用到year值的逻辑,全部放到onEvent回调内部,在setYear之后执行即可,修改后代码如下:
DocumentReference documentReference = fStore.collection("Users").document(userId); documentReference.addSnapshotListener(this, new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) { if (error != null){ if (progressDialog.isShowing()) progressDialog.dismiss(); Log.e("Firestore error",error.getMessage()); return; } assert value != null; String gyear = value.getString("Year"); setYear(gyear); // 把storageReference初始化及后续拉取存储文件的逻辑移到这里 storageReference = FirebaseStorage.getInstance().getReference("AcademicCalendar/"+getYear()+"/AC.jpg"); // 后续处理storageReference的逻辑也写在这里 } });
优化建议
如果你只需要单次获取Year字段值,不需要监听字段的后续变化,建议用get()方法替代addSnapshotListener,避免不必要的持续监听开销:
documentReference.get().addOnCompleteListener(task -> { if (task.isSuccessful()) { DocumentSnapshot document = task.getResult(); if (document.exists()) { String gyear = document.getString("Year"); setYear(gyear); // 后续逻辑同上 storageReference = FirebaseStorage.getInstance().getReference("AcademicCalendar/"+getYear()+"/AC.jpg"); } } else { if (progressDialog.isShowing()) progressDialog.dismiss(); Log.e("Firestore error", task.getException().getMessage()); } });
内容的提问来源于stack exchange,提问作者Jeevan Kumar A Das
相关产品推荐
相关产品推荐

