【发布时间】:2019-02-03 01:18:24
【问题描述】:
首先,如果标题具有误导性,我想道歉。英语不是我的母语,我不知道如何命名这篇文章。现在的问题:
我有一个 Activity,它显示存储在 Firebase 项目中的有关用户的数据。数据分布在 Firebase 用户(显示名称、电子邮件和个人资料图片)和 Cloud Firestore 中名为用户UID 的文档之间。
当这个活动开始时,我做了一个 Firebase google auth 来获取用户,然后问题就来了。我需要知道用户是否在数据库中有一个带有附加数据的链接文档(现有用户),或者他是否需要创建一个(新用户)。我创建了一个方法来检查是否存在名为用户 UID 的文档。方法是这样的:
public void userExists(String uid) {
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference docRef = db.collection("users").document(uid);
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot documentSnapshot = task.getResult();
if (documentSnapshot.exists()) {
aa = true;
aa=true;
} else {
aa = false;
}
} else {
aa = false;
}
}
});
}
(aa是Activity中声明的布尔变量)。
我在下面调用这个方法是为了知道我是否需要启动一个新的Activity来创建文档,或者我是否可以在当前的Activity中毫无问题地显示用户的数据。
private void updateUI(FirebaseUser user) {
if (user != null) {
userExists(user.getUid());
if(aa){
//Fill layout with the user data and the user linked document data
//USER DATA
txvNombre=findViewById(R.id.nombrePerfil);
txvNombre.setText(user.getDisplayName());
imvAvatar=findViewById(R.id.imvVistaPerfilAvatar);
Picasso.with(VistaPerfilActivity.this)
.load(user.getPhotoUrl())
.resize(500,500)
.centerCrop()
.into(imvAvatar);
//HERE GOES THE DOCUMENT DATA
}else{
}
} else {
finish();
}
}
据我所知,Firestore 连接是在新线程中建立的,因此,当 UpdateUI(FirebaseUser user) 启动时,aa 始终为 false,因为 userExists(String uid) 尚未完成。 userExists(String uid) 工作正常,我检查过了。
所以我需要知道如何检查 Firestore 连接线程是否完成,以便继续执行应用程序。我曾尝试使用 OnCompleteListener(如代码所示),但它不起作用。我还尝试在 userExists(String uid) 方法中编写操作,而不是仅更改 aa 的值,然后继续使用另一个方法,但我得到了
从内部类中访问的变量需要声明为final
错误。我尝试按照 Android Studio 的建议将变量设置为 final,但由于显而易见的原因,我无法使用它。
提前致谢。
【问题讨论】:
标签: java android firebase google-cloud-firestore