作者:天涯小犁_640 | 来源:互联网 | 2023-05-25 13:39
我想构建一个在FireBase中返回子值的方法.我试着这样做:public String getMessage(){ root.child("MessagesOnLaunch").child("
我想构建一个在FireBase中返回子值的方法.我试着这样做:
public String getMessage(){
root.child("MessagesOnLaunch").child("Message").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
message = (String) dataSnapshot.getValue();
Log.i("4r398", "work");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("error", firebaseError.getMessage());
}
});
return message;
}
问题是该方法返回null,这可能是因为该方法不会等到侦听器完成并返回null,因为它的默认值为message.
如何使此方法等到侦听器发生然后返回值.
解决方法:
建立一个界面
public interface OnGetDataListener {
//this is for callbacks
void onSuccess(DataSnapshot dataSnapshot);
void onStart();
void onFailure();
}
声明以下函数readData()
public void readData(Firebase ref, final OnGetDataListener listener) {
listener.onStart();
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
listener.onSuccess(dataSnapshot);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
listener.onFailure();
}
});
}
调用readData()函数如下
readData(root.child("MessagesOnLaunch").child("Message"), new OnGetDataListener() {@Overridepublic void onSuccess(DataSnapshot dataSnapshot) {
//got data from database....now you can use the retrieved data}@Overridepublic void onStart() { //when starting Log.d("ONSTART", "Started");}@Overridepublic void onFailure() { Log.d("onFailure", "Failed");}
});
readData()可以在你的getMessage()方法中调用,甚至可以在o??nCreate()里面调用