仅在Firebase数据库更改后,我才能如何调用通知?

时间:2019-03-31 11:27:46

标签: java firebase firebase-realtime-database

作为标题,我想做的只是当数据库发生变化而不是运行通知时,但问题是当我运行应用程序时,即使数据没有更改,通知也会出现 这是我的代码:

 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;
    }

3 个答案:

答案 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。