我想在 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) {
}
});
编辑: 只是为了让每个人都明白我的问题。 当我启动应用程序时,由于上面的代码,会发送一条通知。而且我不希望这种情况发生,相反,我只需要在数据更改时发送通知。
答案 0 :(得分:1)
根据Docs,ValueEventListener 不仅在数据更改时返回值,而且在方法第一次执行时返回值。
据我所知,您的问题有两种可能的解决方案:
您使用 background service 来保持方法在后台运行,这样它就不会在您每次打开应用程序时返回值。这也意味着,即使应用程序未打开,您也会收到通知。我不知道这是否符合您的利益。
存储值并每次手动检查。您可以 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) {
}
});