【问题标题】:Android: using one Firebase ChildEventListener through my appAndroid:通过我的应用程序使用一个 Firebase ChildEventListener
【发布时间】:2017-08-04 13:22:16
【问题描述】:

我正在寻找一种方法来使用ChildEventListener 在每次活动中收听我的数据库中的特定位置。

我有一个购物应用,我需要通过该应用监听用户的订单状态,以显示警报并在本地保存数据。

我有两个想法:

  1. 我想过在OnResume()中附加和分离监听器
    和每个ActivityOnPause(),但代码将在 每个Activity,因为它做同样的工作。
  2. 我考虑将一个监听器附加到MainActivity,然后发送 广播到其他活动,但由于 MainActivity 被销毁而失败

--

监听一个节点并保持应用同步的最佳做法是什么?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    使用多个侦听器时,Firebase 没有问题,即使它是同一个侦听器。只要您根据 Activity 的生命周期移除监听器,Firebase 就会几乎完美地处理监听器。

    你的班级应该是这样的:

    public class HelperClass extends Application {
        private DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
    
        public static verifyStatus() {
            databaseReference.addChildEventListener() /* ... */
        }
    }
    

    您需要根据活动的生命周期删除监听器。如果您在onStart 中添加了侦听器,则必须在onStop 中删除它。如果您在onResume 中添加了侦听器,则必须在onPause 中删除它。如果您在onCreate 中添加了侦听器,则必须在onDestroy 中删除它。但请记住 onDestroy 并不总是被调用。

    希望对你有帮助。

    【讨论】:

    • 你说得对,但我的目标是集中工作,所以以后修改代码很容易。
    • 在这种情况下,您可以创建一个HelperClass,您可以在其中创建一个可以在您需要的每个活动中重复使用的方法。
    • 这很简单...听起来是个好主意,但如果我在每个活动中创建侦听器不会有延迟吗?
    • 现在会有延迟,因为每个监听器都会被分开处理。请记住,Firebase 它是一个实时数据库。
    • 谢谢,这就是我需要听到的,关于生命周期的任何建议? onPause()onResume() 会完美地完成这项工作吗?
    【解决方案2】:

    尝试以这种方式创建一个 class,然后在 class 内部创建您想要的 method

    public class firebaseutils {
    
    public static void check(){
    
        }
    
    }
    

    然后在你想要的地方调用这个,像这样:

    firebaseutils.check();
    

    【讨论】:

      【解决方案3】:

      最近我解决了同样的问题。因此,创建一个 ChildEventListener 的处理程序类,它有一个实例,如 FirebaseDatabase、FirebaseAuth 和其他 Firebase 服务。那个类和这个sn-p是一样的:

      public class ShopHandler implements ChildEventListener {
      
          private static ShopHandler current = null;
          private DatabaseReference databaseReference;
      
          private ShopHandler() {}
      
          public synchronized static void attach() {
              if (current = null) {
                  current = new ShopHandler();
                  databaseReference = FirebaseDatabase.getInstance().getReference("data/yournode");
                  databaseReference.addChildEventListener(this);
              }
          }
      
          public syncrhonized static void detach() {
               // remove listeners and set current as null
          }
          // implements all methods about ChildEventListener
      
      }
      

      【讨论】:

        猜你喜欢
        • 2018-04-16
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多