首页 > 解决方案 > Firestore 异步 API 在 readData 之外获取空值

问题描述

这是我的 logcat 输出

我正在尝试从 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);
    }
}

标签: javaandroidfirebaseasynchronousgoogle-cloud-firestore

解决方案


Firestore 异步 API 在 readData 之外获取空值。

任何需要来自 Cloud Firestore 的数据的代码都需要在“onComplete()”方法中,或者从那里调用。创建另一个回调并不重要,同样的规则适用。这意味着您不能在“onCallback()”方法之外使用“emergencyNumber”的值。请注意,此方法仅在“onComplete()”方法触发时触发,因此该行为。当触发以下 Log 语句时:

Log.d("TAG",emergencyNumber+"middle");

数据尚未完成加载,这就是为什么您在 logcat 中有执行顺序的原因。

如果您对回调不满意,那么我建议您在使用LiveDataViewModel从 Firestore 获取数据时使用处理异步编程的现代方式。在这里,您可以从我的一个存储库中找到一个示例,其中我使用 MVVM 架构模式与 LiveData 和 ViewModel 来验证 Firebase 中的用户。

如果您考虑在某个时间点尝试使用Kotlin,请查看以下示例:

我使用Kotlin Coroutine从 Firestore 获取数据的地方。


推荐阅读