java - Firestore 异步 API 在 readData 之外获取空值
问题描述
我正在尝试从 Firestore 获取数据并对其进行处理尝试过此操作但无法正常工作
在“readData()”之外为“emergencyNumber”获取空值我已经尝试过这个解决方案文本但仍然为空
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_emergency_contact);
Log.d("TAG","Initial");
firebaseAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = firebaseAuth.getCurrentUser().getUid();
readData(new FirebaseCallBack() {
@Override
public void onCallback(String str) {
emergencyNumber = str;
//Toast.makeText(EmergencyContact.this, emergencyNumber, Toast.LENGTH_SHORT).show();
phone = (TextView) dialog.findViewById(R.id.EmergencyContactNumber) ;
//emergencyNumber = phone.getText().toString() + "Hello";
phone.setText(emergencyNumber);
Log.d("TAG",emergencyNumber+"inner read me");
}
});
Log.d("TAG",emergencyNumber+"middle");
Log.d("TAG",emergencyNumber+"end");
}
private void readData(FirebaseCallBack firebaseCallBack) {
documentReference.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()){
DocumentSnapshot document = task.getResult();
long l = document.getLong("EmergencyContact");
emergencyNumber = "0" + Long.toString(l);
firebaseCallBack.onCallback(emergencyNumber);
//Toast.makeText(EmergencyContact.this, emergencyNumber, Toast.LENGTH_SHORT).show();
Log.d("TAG",emergencyNumber+"exit read me");
}
}
});
}
private interface FirebaseCallBack {
void onCallback(String str);
}
}
解决方案
Firestore 异步 API 在 readData 之外获取空值。
任何需要来自 Cloud Firestore 的数据的代码都需要在“onComplete()”方法中,或者从那里调用。创建另一个回调并不重要,同样的规则适用。这意味着您不能在“onCallback()”方法之外使用“emergencyNumber”的值。请注意,此方法仅在“onComplete()”方法触发时触发,因此该行为。当触发以下 Log 语句时:
Log.d("TAG",emergencyNumber+"middle");
数据尚未完成加载,这就是为什么您在 logcat 中有执行顺序的原因。
如果您对回调不满意,那么我建议您在使用LiveData和ViewModel从 Firestore 获取数据时使用处理异步编程的现代方式。在这里,您可以从我的一个存储库中找到一个示例,其中我使用 MVVM 架构模式与 LiveData 和 ViewModel 来验证 Firebase 中的用户。
如果您考虑在某个时间点尝试使用Kotlin,请查看以下示例:
我使用Kotlin Coroutine从 Firestore 获取数据的地方。
推荐阅读
- php - 尽管密码正确,但没有使用 CURL 在 php 中发送短信
- ajax - 如何获取角度 Http 请求的每个 http 正文更新?
- java - 如何在 MapReduce 程序中将文件附加到 HDFS
- c++ - cuda 9.2 curand_init 非常慢
- javascript - c# WPF Browser with html5 video and javascript injection
- contentful - 使用 Contentful REST API 获取包含图像的所有条目
- android - 着色轮廓材质组件按钮的背景
- java - 如何通过java程序使应用程序打开和关闭
- python - 不同的实例是否共享类中声明的相同方法?
- javascript - Firebase 身份验证不适用于 html 表单元素