【问题标题】:Android - Firebase addChildEventListener trigger [duplicate]Android - Firebase addChildEventListener 触发器
【发布时间】:2019-04-20 12:02:48
【问题描述】:

我将 Firebase 用于我的 android 项目。 有一点我不明白。我正在使用一种方法addChildEventListener,据我所知,当添加/删除/更改一个新的孩子并继续时应该触发这个方法...... 出于某种原因,当我的Activity 加载时,此方法会触发。 添加新孩子时不需要触发...?

代码

    refToVideos.getReference(Params.VIDEOS).child(currentUser.getUid()).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot snapshot, String s) {
            long countComments  = (long)snapshot.child(Params.COUNTCOMMENTS).getValue();
            int countComment = ((int) countComments);
            String frameURL  = (String)snapshot.child(Params.FRAMEURL).getValue();
            String genre  = (String)snapshot.child(Params.GENRE).getValue();
            long like  = (long)snapshot.child(Params.LIKES).getValue();
            int likes = ((int)like);
            String uploadDate  = (String)snapshot.child(Params.UPLOADDATE).getValue();
            String userProfile  = (String)snapshot.child(Params.USERPROFILE).getValue();
            String userUID  = (String)snapshot.child(Params.USERUID).getValue();
            String userName  = (String)snapshot.child(Params.USERNAME).getValue();
            String videoID  = (String)snapshot.child(Params.VIDEOID).getValue();
            String videoName  = (String)snapshot.child(Params.VIDEONAME).getValue();
            String videoURL  = (String)snapshot.child(Params.VIDEOURL).getValue();
            long view  = (long)snapshot.child(Params.VIEWS).getValue();
            int views = ((int)view);

            Video video = new Video(videoID,userUID,genre,videoName,videoURL,frameURL,userName,userProfile,likes,
                    views,countComment,uploadDate);
            videosList.add(video);
            if(adapter != null)
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

【问题讨论】:

  • 问题到底出在哪里?何时开启新活动?
  • 问题是在加载活动时,addChildEventListener 被触发,并且我希望它仅在添加/删除/更改子项时触发
  • 确保你把这个函数放在这些函数之外(onCreate, onStart, onResume....)
  • 它的 onCreate。那么我应该把这个函数放在哪里呢?
  • 好的,这取决于您的需要,但是当将任何代码放入这些函数(onCreate....等)时,这意味着该代码将在打开此活动时立即触发

标签: android firebase-realtime-database


【解决方案1】:

来自documentation for onChildAdded

这个回调会为每个现有的孩子触发一次,然后在每次将新的孩子添加到指定路径时再次触发。

因此,当您附加一个侦听器时,它的onChildAdded 方法会“立即”为它所侦听位置中的任何现有子级调用。这就是 API 的定义方式,您无法更改它。

如果您只想了解在附加侦听器之后添加的新子节点,则必须在子节点中包含时间戳之类的东西,以标识它们是否是“新的”。

另请参阅有关该主题的这些先前问题:

【讨论】:

    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2018-08-06
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多