作为标题,我想做的只是当数据库发生变化而不是运行通知时,但问题是当我运行应用程序时,即使数据没有更改,通知也会出现 这是我的代码:
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.main,container,false);
result= (TextView) v.findViewById(R.id.textView3);
notificationmanager = NotificationManagerCompat.from(ct.getcontext());
if (user != null) {
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
String post = dataSnapshot.getValue(String.class);
result.setText(post);
Notification notification = new NotificationCompat.Builder(ct.getcontext(), CHANNEL_1_ID)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle(post)
.setContentText("test")
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_EVENT)
.setDefaults(Notification.DEFAULT_ALL)
.build();
notificationmanager.notify(2,notification);
}
}
@Override
public void onCancelled(DatabaseError error) {
}
});
}
else
{
Toast.makeText(getActivity(),"not yet login",Toast.LENGTH_LONG).show();
}
return v;
}
答案 0 :(得分:1)
将值保存在您的本地首选项中,然后在下一次更改时,通过与先前保存的值进行比较来验证该值是否确实更改过。
答案 1 :(得分:0)
您需要使用来自文档的addValueEventListener()
:
public ValueEventListener addValueEventListener (ValueEventListener listener)
添加一个侦听器,以查找此位置上的数据更改。每次数据更改时,都会使用数据的不变快照来调用您的侦听器。
使用addValueEventListener
,每次数据库中发生更改时,都会触发该更改。
答案 2 :(得分:0)
从@mikasaloli的解释中,我怀疑问题更多在于Firebase RTDB(实时数据库)/ Firestore函数和错误的侦听器的混合方式。
第一个问题是,默认情况下,firebase RTDB / firestore会保留您在手机上访问的引用(不是全部引用)的本地缓存副本。从他们的文档they say中,我引用: “异步侦听器:通过将异步侦听器附加到数据库引用来检索Firebase实时数据库中存储的数据。该侦听器会针对数据的初始状态触发一次,并且在数据发生更改时会再次触发。事件侦听器可能会收到几种不同的{ {3}}。Java,Node.js和Python Admin SDK支持这种数据检索方式。” 您需要做的是在应用启动后首次读取数据时绕过本地缓存。 types of events
第二个问题是前面提到的其他问题,addListenerForSingleValueEvent将仅被触发一次。因此,假设您是第一次收到通知更改,那么您的侦听器将自动注销自身,这意味着您将不会再接收后续的onDataChange事件。
现在,从前面的段落中推测,上述代码的问题是: 它为单值事件附加了一个侦听器。然后使用本地(缓存的)数据版本触发该数据,该版本强制不是服务器数据库的最新状态(如果应用程序处于脱机状态而在线进行了一些更改)。但是随后,在附加此侦听器后,它会被数据的本地版本触发,然后自行注销。这意味着,上面的代码最多只被触发一次,并且在附加后的生命周期内可能永远不会被触发。
我建议您绕过本地缓存并使用addValueEventListener。