我正在尝试建立与firebase的基本连接并从firebase db获取一些数据,但在触发回调之前,我的主线程退出上下文并且我没有获得任何数据作为回报。以下是我的代码:
public class UserStore {
private Firebase rootRef_;
private UserDetails userDetails;
public UserStore() {
rootRef_ = new Firebase("https://<FIREBASE-APP>.firebaseio.com/");
}
public UserDetails getUserDetails(String mailId) {
mailId = mailId.toLowerCase().replace(".", ",");
rootRef_.child("users/" + mailId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot != null) {
System.out.println("user data snapshot: " + dataSnapshot.toString());
UserStore.this.userDetails = dataSnapshot.getValue(UserDetails.class);
} else {
System.out.println("data snapshot is null!!");
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
return userDetails;
}
}
我收到了对查询的正确回复,但这需要时间。我尝试在这种方法中使用sleep。它工作正常,但它不会是实时。
无论如何,我可以获得实时响应吗?
答案 0 :(得分:0)
您在回调完成之前返回UserDetail。 这实际上是关于异步代码组织而不是Firebase。
public void getUserDetails(String mailId) {
mailId = mailId.toLowerCase().replace(".", ",");
rootRef_.child("users/" + mailId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot != null) {
System.out.println("user data snapshot: " + dataSnapshot.toString());
UserDetail userDetails = dataSnapshot.getValue(UserDetails.class);
//DO SOMETHING WITH USER DETAILS HERE!
} else {
System.out.println("data snapshot is null!!");
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
//DONT RETURN USER DETAILS HERE
}
有关详细信息,请查看AsyncTask或RxJava with Android