【问题标题】:Query in Firebase - Cloud databese [duplicate]Firebase 中的查询 - 云数据库 [重复]
【发布时间】:2019-06-10 07:40:06
【问题描述】:

我正在开发一个 Android 应用程序,我决定将数据保存在 Firebase 中。目前我在加载数据时遇到了一个障碍。 首先我想展示一下应用程序的架构:

在方法OnCreate 中创建了FirebaseHandler 的实例(它是单例类)。实例存在后,MainActivity调用方法nameOfMember

 public void nameOfMember() {
    DocumentReference documentReference = db.document(pathTOOffersPrefix + userID);
    Log.d(TAG, "nameOfMember: " + pathTOOffersPrefix + userID);

    documentReference.get()
            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                @Override
                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    if (documentSnapshot.exists()) {
                        String name = documentSnapshot.getString(ARG_Firebase_User_Name);
                        String surname = documentSnapshot.getString(ARG_Firebase_User_SurName);
                        setName(name);
                        setSurname(name);
                        Log.d(TAG, "onSuccess: " + name + " " + surname);
                    } else {
                        Log.d(TAG, "onSuccess: but not exist");
                    }

                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d(TAG, "onFailure: " + e.getMessage());
                }
            });
}

此方法设置 FirebaseHandler 实例的两个参数(以供将来使用)。它正在工作,但现在问题来了。在 Main.java 我试图得到这个论点:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        firebaseHandler = FirebaseHandler.getInstance();
        firebaseHandler.getName();
        firebaseHandler.getSurname();
}

主要问题是,方法 Main.onCreate 将在 FirebaseHandler.onSuccess 之前完成。

我想问一下,是否有人知道如何解决它(一些回调?或)。

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    是的,这是后台处理的正常行为,因为 Firebase 数据库函数在单独的线程中执行,那么您需要执行以下操作:

    1. 创建一个interface 作为getString() 方法的侦听器:

      public interface OnValueReadyListener {
          void onValueReady(String name, String surName);
      }
      
    2. 将接口实例传递给nameOfMember 方法:

      public void nameOfMember(OnValueReadyListener listener) {
          ...
      }
      
    3. onSuccess方法内部,调用监听器:

      @Override
      public void onSuccess(DocumentSnapshot documentSnapshot) {
          if (documentSnapshot.exists()) {
              String name = documentSnapshot.getString(ARG_Firebase_User_Name);
              String surname = documentSnapshot.getString(ARG_Firebase_User_SurName);
              listener.onValueReady(name, surname);
              Log.d(TAG, "onSuccess: " + name + " " + surname);
          } else {
              Log.d(TAG, "onSuccess: but not exist");
          }
      
      }
      
    4. onCreate调用方法nameOfMember如下:

      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          firebaseHandler = FirebaseHandler.getInstance();
          firebaseHandler.nameOfMember(new OnValueReadyListener() {
               public void onValueReady(String name, String surName) {
                   // Do what you need here. you have the values ready
               }
          });
      
      }
      

    【讨论】:

    • 它已经实施并且有效!!!非常感谢
    猜你喜欢
    • 2017-09-22
    • 2018-12-03
    • 2019-09-04
    • 1970-01-01
    • 2019-05-07
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    相关资源
    最近更新 更多