Firebase助手类

时间:2017-06-28 16:35:35

标签: java android firebase firebase-realtime-database

我正在使用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()没有返回任何内容。

2 个答案:

答案 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获取数据调用活动回调时,让你的活动实现它...