Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-firestore查询在返回语句之前未完成_Java_Android_Firebase_Google Cloud Firestore - Fatal编程技术网

Java Android-firestore查询在返回语句之前未完成

Java Android-firestore查询在返回语句之前未完成,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,因此,我遇到的问题是loadUserNameFromFirestore()方法在firestore db.collection.get()查询完成执行之前执行return语句。我将日志放在firestore db.collection.get()查询之后,方法返回语句之前 private String loadUserNameFromFirestore(Appointment appointment) { final StringBuilder userFullName = new S

因此,我遇到的问题是loadUserNameFromFirestore()方法在firestore db.collection.get()查询完成执行之前执行return语句。我将日志放在firestore db.collection.get()查询之后,方法返回语句之前

private String loadUserNameFromFirestore(Appointment appointment) {

    final StringBuilder userFullName = new StringBuilder();
    String userUid = appointment.getAppointment_doctor_uid();

    db.collection(Constants.FIRESTORE_DOCTOR).document(userUid)
            .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            DocumentSnapshot documentSnapshot = task.getResult();
            userFullName.append(documentSnapshot.getString(Constants.FIRESTORE_STAFF_TITLE)).append(" ");
            userFullName.append(documentSnapshot.getString(Constants.FIRESTORE_STAFF_FNAME)).append(" ");
            userFullName.append(documentSnapshot.getString(Constants.FIRESTORE_STAFF_LNAME));
            Log.d("DEBUG_APP", userFullName.toString());
        }
    })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                }
            });

    Log.d("DEBUG_APP", "Final: " + userFullName.toString());

    return userFullName.toString();
}
如上所示,首先执行返回语句“First:”之前的日志,然后执行firestore查询“Dr Naila Alam”之后的日志


有没有办法确保在firestore完成执行之前不会调用return语句。非常感谢您的帮助。

如您所见,您对firebase的请求是一个异步操作,因此代码不会等待它完成,而是继续他的路线。 您附加的侦听器在另一个线程上工作,因此您的GUI不会冻结。这就是为什么无法运行通过firebase调用返回值的方法

您必须修改您的代码以调用方法来检索值,并且在onComplete方法中,调用另一个方法来设置获取的值

例如:(假设您需要用户名在GUI上显示它)

public void setTextUsername(字符串用户名)
this.textViewUsername.setText(用户名);
//在这里,您可以使用用户名值完成所有需要的操作
}
来自FireStore的公共void LoadUserName(约会){
字符串userUid=appointment.getAppointment\u doctor\u uid();
db.collection(Constants.FIRESTORE\u DOCTOR).document(userUid)
.get().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(@NonNull任务){
StringBuilder userFullName=新建StringBuilder();
DocumentSnapshot DocumentSnapshot=task.getResult();
userFullName.append(documentSnapshot.getString(Constants.FIRESTORE\u STAFF\u TITLE)).append(“”);
userFullName.append(documentSnapshot.getString(Constants.FIRESTORE\u STAFF\u FNAME)).append(“”);
userFullName.append(documentSnapshot.getString(Constants.FIRESTORE\u STAFF\u LNAME));
Log.d(“DEBUG_APP”,userFullName.toString());
setTextUsername(userFullName.toString());
}})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
}
});
}

如果你有什么不清楚的地方,请毫不犹豫地问。我很乐意提供我的帮助

您现在无法返回尚未加载的内容。因此,请检查副本以了解为什么会出现这种行为,以及如何使用自定义回调解决此问题。抱歉,我没有看到副本。这确实奏效了!非常感谢。但是,当我在OnClick方法中调用回调时,使用intent.putExtra(callBackData)将数据放入intent中会遇到问题。startActivity()将在将数据放入意图之前首先被调用,因此我在第二个活动中不会看到回调数据@阿列克斯马莫戈德听说它奏效了:)这似乎是另一个问题。为了遵守这个社区的规则,请发布另一个新的问题,这样我和其他用户可以帮助你。没问题,谢谢!!这真的很有帮助。尽管如此,我还是在我的RecyclerView适配器的onBindViewHolder()中使用loadUserNameFromFirestore()方法。因此,在您的解决方案中,holder.setText()将在loadUserNameFromFirestore()之前首先被调用。这将导致setTextUsername()未被调用,因此无法工作。我解决这个问题的方法是将ViewHolder作为loadUserNameFromFirestore()中的参数传递,并在setTextUsername()中调用holder.setText()。但是,这将不允许我在OnClick()中检索用户名。有办法吗?对不起,我不明白你的意思。。使用firebase时,这是一种非常糟糕的技术。如果我理解正确,您可以为回收视图中的每个项目调用读取操作。。这意味着,如果您有200个约会,您将对firebase执行201个读取调用(1个用于约会列表,200个用于每个用户)。。这对性能和您的金钱都非常不利。如果您只需要用户名,请考虑将其作为约会字段。。所以,检索约会列表时,您也有用户名!为了更好地理解,在示例中,firebase中的约会结构将是:约会{askdmadnbwKNSA{id:askdmadnbwKNSA,userId:LIKs854Aend,userName:Doc.Michael,date:1929281182912,等等。}是的,我完全同意你的看法。但是,我目前在我的约会字段中有一个用户ID。出于数据规范化的目的,我想我会使用该用户ID作为外键,并从Firestore中的用户表中访问我的用户详细信息。是的@jdcles12..我知道你在说什么..但是Firebase使用非规范化结构..这非常不推荐我建议您使用这种类型的数据组织。如果可以,我建议您查看此链接以了解更多您可以使用的各种技术:
10-03 02:43:30.561....: Final:  
10-03 02:43:31.044....: Dr Naila Alam
public void setTextUsername(String username)
    this.textViewUsername.setText(username);
    //here you can do all you need with username value
}

public void loadUserNameFromFirestore(Appointment appointment){
    String userUid = appointment.getAppointment_doctor_uid();

    db.collection(Constants.FIRESTORE_DOCTOR).document(userUid)
        .get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {

    @Override
    public void onSuccess(@NonNull Task<DocumentSnapshot> task) {
        StringBuilder userFullName = new StringBuilder();
        DocumentSnapshot documentSnapshot = task.getResult();
        userFullName.append(documentSnapshot.getString(Constants.FIRESTORE_STAFF_TITLE)).append(" ");
        userFullName.append(documentSnapshot.getString(Constants.FIRESTORE_STAFF_FNAME)).append(" ");
        userFullName.append(documentSnapshot.getString(Constants.FIRESTORE_STAFF_LNAME));
        Log.d("DEBUG_APP", userFullName.toString());
        setTextUsername(userFullName.toString());
    }})
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
            }
        });
}