我正在使用Firebase库进行练习,我希望能够在Main的一个单独的类中使用一些方法,从而能够调用这些方法并返回例如用户。
示例FirebaseDBHelper.java
public static UserModel getUserFromId(String userId) {
final UserModel[] user = new UserModel[1];
dbRef.child("status").child(userId).addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Get user value
user[0] = dataSnapshot.getValue(UserModel.class);
Log.d("TAG", "Value is: " + dataSnapshot.getValue());
Log.d("TAG", "User: " + user);
// ...
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("TAG", "getUser:onCancelled", databaseError.toException());
// ...
}
});
return user[0];
}
主要电话
UserModel user = FirebaseDatabaseHelper.getUserFromId("9876");
Log.d("TAG", "UserInfo: " + user);
但我遇到了一些问题,因为方法getUserFromId()
没有返回任何内容。
答案 0 :(得分:4)
如果您了解RxJava2,那么采用这种方法真的很不错:
public Observable<UserModel> UserModel getUserFromId(String userId) {
return Observable.create(new ObservableOnSubscribe<UserModel>() {
@Override
public void subscribe(@NonNull ObservableEmitter<UserModel> e) throws Exception {
dbRef.child("status").child(userId).addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Get user value
UserModel user = dataSnapshot.getValue(UserModel.class);
e.onNext(user);
// ...
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("TAG", "getUser:onCancelled", databaseError.toException());
e.onError(databaseError);
// ...
}
});
}
});
}
或者,您可以在获得UserModel
这样的
public static void getUserFromId(String userId,OnGetUser callback) {
dbRef.child("status").child(userId).addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Get user value
user[0] = dataSnapshot.getValue(UserModel.class);
Log.d("TAG", "Value is: " + dataSnapshot.getValue());
Log.d("TAG", "User: " + user);
callback.onGetUser();
// ...
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("TAG", "getUser:onCancelled", databaseError.toException());
// ...
}
});
}
interface OnGetUser
{
void onGetUser();
}
或者,user[0]
在调用onCancelled
时应该有一些价值,例如空UserModel
答案 1 :(得分:1)
更好的方法是使用helper类的回调创建和接口,当你调用静态方法时,当firebase获取数据调用活动回调时,让你的活动实现它...