好吧,我想创建这个方法,但由于你无法从监听器的方法返回,我只是想办法在firebase找到它时给用户:
public static User findByID(@NonNegative final int id) {
getDatabase().orderByChild("id")
.equalTo(id)
.limitToFirst(1)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
dataSnapshot.getValue(User.class); // this one must be returned
}
@Override public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
@Override public void onChildRemoved(DataSnapshot dataSnapshot) {}
@Override public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
@Override public void onCancelled(DatabaseError databaseError) {}
});
}
创建一个接收值和返回的变量也不起作用,因为firebase需要一点时间才能找到用户。
答案 0 :(得分:3)
数据检索在Firebase中是异步的,因此您无法返回。我认为有两种方法可以克服你所面临的问题。
第一种方式
如果数据应该返回到存在findById()
的同一个类中的某个位置,那么您可以执行以下操作:
class A {
private TextView nameTextView;
...
public void findById(@NonNegative int id) {
userRef().orderByChild("id")
.equalTo(id)
.limitToFirst(1)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
User user = dataSnapshot.getValue(User.class);
onUserRetrieved(user);
}
...
});
}
private void onUserRetrived(User user) {
// Now you can do whatever you want with the "user"
// For instance, update name field in the layout...
nameTextView.setText(user.getName);
...
}
}
第二种方式
如果需要通知另一个类的实例,可以将侦听器作为参数传递给该函数,然后调用该侦听器中的方法作为通知调用者的方法。示例调用程序如下所示:
class Caller {
...
private void someFunction() {
...
String userId = 1; // Get user id somehow
DatabaseUtil.findUserById(userId, new DatabaseUtil.Listener() {
@Override
public void onUserRetrieved(User user) {
// Now you can do whatever you want with the "user"
}
});
...
}
}
而静态函数可以如下所示驻留在类中:
class DatabaseUtil {
public static void findUserById(@NonNegative int id, Listener listener) {
FirebaseDatabase.getInstance().getreference("user")
.orderByChild("id")
.equalTo(id)
.limitToFirst(1)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
User user = dataSnapshot.getValue(User.class);
listener.onUserRetrieved(user);
}
...
});
}
interface Listener {
void onUserRetrieved(User user);
}
}