仅在数据更新 android 时调用的 Firebase 事件侦听器

时间:2020-12-27 14:00:44

标签: android firebase firebase-realtime-database

我想在 firebase 中的数据发生变化时发送通知。 但是当我使用 addValueEvenListener() 方法时,它返回不止一次。之后我尝试使用 addListenerForSingleValueEvent() 方法,但它现在返回 2 次,当我启动应用程序和数据更改时。有没有办法让它只返回一次,即数据更改时而不是应用程序启动时?

这是我现在的代码:

databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                sendNotification("notification","App name",getIntent().getStringExtra("storeid"));
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

编辑: 只是为了让每个人都明白我的问题。 当我启动应用程序时,由于上面的代码,会发送一条通知。而且我不希望这种情况发生,相反,我只需要在数据更改时发送通知。

3 个答案:

答案 0 :(得分:1)

根据Docs,ValueEventListener 不仅在数据更改时返回值,而且在方法第一次执行时返回值。

据我所知,您的问题有两种可能的解决方案:

  1. 您使用 background service 来保持方法在后台运行,这样它就不会在您每次打开应用程序时返回值。这也意味着,即使应用程序未打开,您也会收到通知。我不知道这是否符合您的利益。

  2. 存储值并每次手动检查。您可以 save the returned value to the storage 并在每次侦听器执行时检查新值是否与先前值不同。

希望我能帮上忙,快乐编码

答案 1 :(得分:0)

存储在 Firebase 实时数据库中的数据是通过将其附加到异步侦听器数据源来检索的。侦听器在其初始状态和每次数据更改时再次触发。就您而言,文档中没有提供明确的解决方案。

答案 2 :(得分:0)

假设你有一个布尔变量 在您注册侦听器的类中全局声明

boolean isCalled=false;

在注册监听器之前重置它。

    isCalled=false;
    databaseReference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                 if(isCalled){
                      //it is already called once.
                      sendNotification("notification","App name",getIntent().getStringExtra("storeid"));
                   }else{
                      //called first time
                      isCalled=true;
                   }
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError error) {
    
                }
            });
相关问题