我正在开发一个Android应用程序,因此决定将数据保存在Firebase中。目前,我在加载数据时遇到了一个障碍。 首先,我想展示一下应用程序的体系结构:
在方法OnCreate
中创建 FirebaseHandler 的实例(它是单例类)。实例存在后,MainActivity调用方法 nameOfMember 。
public void nameOfMember() {
DocumentReference documentReference = db.document(pathTOOffersPrefix + userID);
Log.d(TAG, "nameOfMember: " + pathTOOffersPrefix + userID);
documentReference.get()
.addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists()) {
String name = documentSnapshot.getString(ARG_Firebase_User_Name);
String surname = documentSnapshot.getString(ARG_Firebase_User_SurName);
setName(name);
setSurname(name);
Log.d(TAG, "onSuccess: " + name + " " + surname);
} else {
Log.d(TAG, "onSuccess: but not exist");
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "onFailure: " + e.getMessage());
}
});
}
此方法设置了FirebaseHandler实例的两个参数(供将来使用)。它正在工作,但是现在出现了问题。在 Main.java 中,我尝试获取以下参数:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firebaseHandler = FirebaseHandler.getInstance();
firebaseHandler.getName();
firebaseHandler.getSurname();
}
主要问题是,方法Main.onCreate的确定要早于FirebaseHandler.onSuccess。
我想问一下,是否有人知道如何解决(某些回调?)。
答案 0 :(得分:1)
是的,这是后台处理的正常行为,因为Firebase数据库功能是在单独的线程中执行的,那么您需要执行以下操作:
创建一个interface
作为getString()
方法的侦听器:
public interface OnValueReadyListener {
void onValueReady(String name, String surName);
}
将接口的实例传递给nameOfMember
方法:
public void nameOfMember(OnValueReadyListener listener) {
...
}
在onSuccess
方法内,调用侦听器:
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists()) {
String name = documentSnapshot.getString(ARG_Firebase_User_Name);
String surname = documentSnapshot.getString(ARG_Firebase_User_SurName);
listener.onValueReady(name, surname);
Log.d(TAG, "onSuccess: " + name + " " + surname);
} else {
Log.d(TAG, "onSuccess: but not exist");
}
}
从nameOfMember
调用方法onCreate
,如下所示:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firebaseHandler = FirebaseHandler.getInstance();
firebaseHandler.nameOfMember(new OnValueReadyListener() {
public void onValueReady(String name, String surName) {
// Do what you need here. you have the values ready
}
});
}