java - Firebase 帮助类

标签 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() 没有返回任何东西。

最佳答案

如果您了解 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 时定义接口(interface)回调

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();
}

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

关于java - Firebase 帮助类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44808149/

相关文章:

java - 何时调用 View.onMeasure()?

android - 以编程方式读取 Android logcat 时,并非显示所有数据

android - Android中解析多行json

Java发送电子邮件 "Client Server"

java - 如何使用 Eclipse 在 pdf 中创建波斯语内容

java - JTextField 无法调整大小

android - 带有 Django 后端的简单 QR 阅读器。 PhoneGap 合适吗?

ios - Firebase 存储错误

javascript - AngularJS 1.3.8 中的 "Argument ' BrowseController ' is not a function, got undefined"

android - 弹出的 React Native 应用程序无法到达 Firestore 后端