android - 仅在数据更新时调用的 Firebase 事件监听器
问题描述
每当 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) {
}
});
编辑:让每个人都理解我的问题。当我启动应用程序时,由于上面的代码,会发送通知。而且我不希望这种情况发生,相反,我只需要在数据更改时发送通知。
解决方案
根据Docs, ValueEventListener 不仅在数据更改时返回值,而且在方法首次执行时返回。
据我所知,您的问题有两种可能的解决方案:
您使用后台服务是为了使该方法在后台运行,以便每次打开应用程序时它都不会返回值。这也意味着,您甚至会在应用程序未打开时收到通知。我不知道这是否符合你的利益。
存储该值并每次手动检查。您可以将返回的值保存到存储中,并在每次侦听器执行时检查新值是否与先前的值不同。
我希望我能帮上忙,快乐的编码
推荐阅读
- python - Pyral [python rally toolkit version 1.4.2] 错误:AttributeError: 'RallyRESTResponse' 对象没有属性 '_servable'
- r - 在 Linux 上根据 Windows-1252 进行 R char 排序
- python - TypeError: individual_success_handle() 缺少 4 个必需的位置参数:“request_type”、“name”、“response_time”和“response_length”
- javascript - 谷歌地图,带有多个距离标记和聚类的路线
- javascript - 交叉点观察者中有 entry.target.Classname 吗?
- c++ - 为什么 C++ 总是显示一个十六进制的内存地址而不仅仅是一个整数?
- android - 我应该在使用 viewModel 时添加 binding.lifecycleOwner=this 吗?
- html - Jquery不在父循环内循环
- java - OutputStream 未完全写入 mp3
- c++ - 整数数组 [n] 与新整数 [n]