android Firestore 回调不工作
android callback with firestore not working
我正在尝试从 firestore 获取数据,我想在执行其余代码之前获取数据,所以我使用了回调
起初我创建了一个 class DbManger,它有一个静态方法和一个接口
public class DbManager
{
private static FirebaseFirestore db;
private static FirebaseAuth auth;
private static FirebaseUser currentUser;
public static void getField(String uid,String key, FirebaseCallBack callBack) {
db= FirebaseFirestore.getInstance();
auth=FirebaseAuth.getInstance();
currentUser = auth.getCurrentUser();
db.collection(Keys.USERS_KEY).document(uid).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot documentSnapshot = task.getResult();
String field = documentSnapshot.getString(key);
callBack.onCallBack(field);
}
}
});
}
public interface FirebaseCallBack
{
void onCallBack(String field) ;
}
}
在另一个 activity 中,我试图在 DbManager class 的帮助下获取数据,就像那样
if(currentUser!=null){
DbManager.getField(currentUser.getUid(), Keys.ACCOUNT_TYPE_KEY, new DbManager.FirebaseCallBack() {
@Override
public void onCallBack(String field) {
accountType=field;
}
});
}
if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY))
selectFragment(new HomeFragment());
else
selectFragment(new ModulesFragment());
但我没有得到任何数据
问题是您的 if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY))
在 accountType=field
之前运行。查看此内容的最简单方法是添加一些日志记录,或在调试器中的这些行和 运行 上设置断点。
这个问题的解决方案总是相同的:需要数据的代码需要在数据可用后调用的回调中。所以最简单的解决方法是:
if(currentUser!=null){
DbManager.getField(currentUser.getUid(), Keys.ACCOUNT_TYPE_KEY, new DbManager.FirebaseCallBack() {
@Override
public void onCallBack(String field) {
accountType=field;
if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY))
selectFragment(new HomeFragment());
else
selectFragment(new ModulesFragment());
}
});
}
另见:
我正在尝试从 firestore 获取数据,我想在执行其余代码之前获取数据,所以我使用了回调 起初我创建了一个 class DbManger,它有一个静态方法和一个接口
public class DbManager
{
private static FirebaseFirestore db;
private static FirebaseAuth auth;
private static FirebaseUser currentUser;
public static void getField(String uid,String key, FirebaseCallBack callBack) {
db= FirebaseFirestore.getInstance();
auth=FirebaseAuth.getInstance();
currentUser = auth.getCurrentUser();
db.collection(Keys.USERS_KEY).document(uid).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot documentSnapshot = task.getResult();
String field = documentSnapshot.getString(key);
callBack.onCallBack(field);
}
}
});
}
public interface FirebaseCallBack
{
void onCallBack(String field) ;
}
}
在另一个 activity 中,我试图在 DbManager class 的帮助下获取数据,就像那样
if(currentUser!=null){
DbManager.getField(currentUser.getUid(), Keys.ACCOUNT_TYPE_KEY, new DbManager.FirebaseCallBack() {
@Override
public void onCallBack(String field) {
accountType=field;
}
});
}
if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY))
selectFragment(new HomeFragment());
else
selectFragment(new ModulesFragment());
但我没有得到任何数据
问题是您的 if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY))
在 accountType=field
之前运行。查看此内容的最简单方法是添加一些日志记录,或在调试器中的这些行和 运行 上设置断点。
这个问题的解决方案总是相同的:需要数据的代码需要在数据可用后调用的回调中。所以最简单的解决方法是:
if(currentUser!=null){
DbManager.getField(currentUser.getUid(), Keys.ACCOUNT_TYPE_KEY, new DbManager.FirebaseCallBack() {
@Override
public void onCallBack(String field) {
accountType=field;
if(accountType.equals(Keys.ADMIN_ACCOUNT_TYPE_KEY))
selectFragment(new HomeFragment());
else
selectFragment(new ModulesFragment());
}
});
}
另见: