Android 无法从文档引用获取数据

Android 无法从文档引用获取数据,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,这是我的代码片段: 我想从文档NewDocument中获取积分 import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import android.widget.Toast; import com.go

这是我的代码片段:

我想从文档NewDocument中获取积分

import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
String data;

FirebaseFirestore firebaseFirestore=FirebaseFirestore.getInstance();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Adder("Hello");

        TextView txt=findViewById(R.id.textView);
        txt.setText(Gettingdata());

}

private String Gettingdata() {
    firebaseFirestore.collection("Users").document("NewDocument")
            .get()
            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                @Override
                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    if (documentSnapshot!=null) {
                        data = documentSnapshot.toString().getString("email");

                    } else {
                        data="else case";
                        Log.d("Tag           ", "else case");
                        // Toast.makeText(this, "Document Does Not exists", Toast.LENGTH_SHORT).show();
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // Toast.makeText(, "", Toast.LENGTH_SHORT).show();
            // Log.d("Tag",e.toString());
            data="Failed";
        }
    });
    return data;
}
}
import android.support.annotation.NonNull;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.google.android.gms.tasks.OnCompleteListener;
导入com.google.android.gms.tasks.OnFailureListener;
导入com.google.android.gms.tasks.OnSuccessListener;
导入com.google.android.gms.tasks.Task;
导入com.google.firebase.firestore.DocumentReference;
导入com.google.firebase.firestore.DocumentSnapshot;
导入com.google.firebase.firestore.FirebaseFirestore;
导入com.google.firebase.firestore.QuerySnapshot;
导入java.util.HashMap;
导入java.util.Map;
公共类MainActivity扩展了AppCompatActivity{
字符串数据;
FirebaseFirestore=FirebaseFirestore.getInstance();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//加法器(“你好”);
TextView txt=findviewbyd(R.id.TextView);
txt.setText(Gettingdata());
}
私有字符串Gettingdata(){
firebaseFirestore.collection(“用户”).document(“新文档”)
.get()
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(文档快照文档快照){
如果(documentSnapshot!=null){
data=documentSnapshot.toString().getString(“电子邮件”);
}否则{
data=“else case”;
Log.d(“标签”、“其他情况”);
//Toast.makeText(此“文档不存在”,Toast.LENGTH_SHORT.show();
}
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//Toast.makeText(,“”,Toast.LENGTH_SHORT).show();
//Log.d(“Tag”,例如toString());
data=“失败”;
}
});
返回数据;
}
}
但返回的数据为空

请帮我解决这个问题
我还需要firestore中的数字点。我尝试了很多,但返回值总是空的

您可以使用Alex Mamo建议或直接在响应中设置视图:

TextView myTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Adder("Hello");

      myTextView =findViewById(R.id.textView);
      Gettingdata();


}

private void Gettingdata() {
    firebaseFirestore.collection("Users").document("NewDocument")
            .get()
            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                @Override
                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    if (documentSnapshot!=null) {
                        data = documentSnapshot.toString().getString("email");
                    myTextView.setText(data);

                    } else {
                        data="else case";
                        Log.d("Tag           ", "else case");
                        // Toast.makeText(this, "Document Does Not exists", Toast.LENGTH_SHORT).show();
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // Toast.makeText(, "", Toast.LENGTH_SHORT).show();
            // Log.d("Tag",e.toString());
            data="Failed";
        }
    });
}
}
TextView我的TextView;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//加法器(“你好”);
myTextView=findViewById(R.id.textView);
获取数据();
}
私有void Gettingdata(){
firebaseFirestore.collection(“用户”).document(“新文档”)
.get()
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(文档快照文档快照){
如果(documentSnapshot!=null){
data=documentSnapshot.toString().getString(“电子邮件”);
myTextView.setText(数据);
}否则{
data=“else case”;
Log.d(“标签”、“其他情况”);
//Toast.makeText(此“文档不存在”,Toast.LENGTH_SHORT.show();
}
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//Toast.makeText(,“”,Toast.LENGTH_SHORT).show();
//Log.d(“Tag”,例如toString());
data=“失败”;
}
});
}
}

Firebase调用是异步的,因此无法在方法中返回数据,因为它尚未“到达”。您可以对onResponse中的到达做出反应,或者按照Alex的建议创建回调结构(这是一种更干净、更有组织的方法).

的可能重复项请检查重复项,以了解您为什么会有这种行为,以及如何使用自定义回调解决此问题。您能否解释一下如何做到这一点,因为我是firebase和android的新手@Levi AlbuquerqueI已经更改了上面的代码以使其正常工作,现在您需要等待,直到firebase对TextView中的only then setText做出响应。这是因为调用是异步的,所以需要一些时间才能返回