Firebase 助手类

Jac*_*ava 1 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];
}
Run Code Online (Sandbox Code Playgroud)

主叫

UserModel user = FirebaseDatabaseHelper.getUserFromId("9876");
Log.d("TAG", "UserInfo: " + user);
Run Code Online (Sandbox Code Playgroud)

但是我有一些问题,因为该方法getUserFromId()不返回任何内容。

nhp*_*nhp 6

如果您了解 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);
                            // ...
                        }
                    });
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

或者,当你得到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();
}
Run Code Online (Sandbox Code Playgroud)

或者,user[0]onCancelled被调用时应该有一些值,比如空UserModel