【问题标题】:Firestore asynchronous API getting null values outside readDataFirestore 异步 API 在 readData 之外获取空值
【发布时间】:2021-04-16 16:59:16
【问题描述】:

this is my logcat output

我正在尝试从 Firestore 获取数据并对其进行处理 tried this but not working

在“readData()”之外为“emergencyNumber”获取空值 我已经尝试过这个解决方案Text,但仍然为空


 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);
    }
}

【问题讨论】:

    标签: java android firebase asynchronous google-cloud-firestore


    【解决方案1】:

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

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

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

    数据还没有完成加载,这就是为什么你的 logcat 中有这个执行顺序。

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 2020-10-17
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 2018-09-14
      相关资源
      最近更新 更多