【问题标题】:addValueEventListener runs even when I just return to the app from a sleep mode即使我刚刚从睡眠模式返回应用程序,addValueEventListener 也会运行
【发布时间】:2017-12-04 04:13:28
【问题描述】:

我正在使用 Firebase 实时数据库开发一个安卓应用。

每当数据库中的数据发生变化时,我的addValueEventListener 就会运行特定的参考。它也会在应用程序启动时运行。这些对我来说很有意义,但是当我从不同的活动返回我的应用程序时,它甚至会运行。例如,当我转到手机的 HOME 屏幕并返回此应用程序时,它会运行,addValueEventListener 运行。

这对我来说是个问题,因为每当我的应用程序中发生数据更改时,我都会执行vibration。我在第一次访问应用程序时放置了一个全局int 变量以防止vibration

它的工作原理是:

matchReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if(notificationCounter > 0) notifyGoals(getView());

                clearCurrentList();
                notificationCounter++;

                // Fires every single time the channelReference updates in the
                }

                adapter.notifyDataSetChanged();

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

我在这个函数之外初始化int notificationCounter = 0,这样每当我重新运行这个应用程序时它就会被重置为0。但是,每当我在手机上进行不同的活动(主屏幕或锁定屏幕)并返回此屏幕时,它会在 int notificationCounter = 0 初始化之前运行 addValueEventListener。我该如何解决这个问题?

【问题讨论】:

  • 创建函数并在 addValueEventListener 中调用它,并在该函数中初始化 notificationCounter = 0
  • 你在哪里调用 matchReference.addValueEventListener?是否在 onResume 中
  • @RissmonSuresh 抱歉没有提及。它在 onStart
  • @WaleedAsim 与我在代码中所做的有什么不同?
  • 尝试将其移入 onCreate

标签: android firebase firebase-realtime-database


【解决方案1】:

发生这种情况是因为onDataChange() 方法被异步调用,这意味着此方法不会等待从您的数据库中获取数据,甚至会在之前调用。要解决这个问题,您有 2 个选择。一种方法是将notificationCounter int 的声明移到onDataChange() 方法中,或者第二种方法是深入了解异步词并使用我在post 中的回答。

【讨论】:

    【解决方案2】:

    只需在活动暂停中删除你的 valueListener

    private HashMap<DatabaseReference, ValueEventListener> hashMap = new HashMap<>();
    private ValueEventListener valueEventListener;
    
    
     mChatReference.child(groupID).addValueEventListener(valueEventListener=new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            }
    
    
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
    
            }
        });
    
    
    
      @Override
    public void onBackPressed() {
        hashMap.put(mChatReference.child(groupID), valueEventListener); 
        removeValueEventListener(hashMap);
        finish();
    }
    public void removeValueEventListener(HashMap<DatabaseReference, ValueEventListener> hashMap) {
        for (Map.Entry<DatabaseReference, ValueEventListener> entry : hashMap.entrySet()) {
            DatabaseReference databaseReference = entry.getKey();
            ValueEventListener valueEventListener = entry.getValue();
            databaseReference.removeEventListener(valueEventListener);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2021-02-27
      相关资源
      最近更新 更多