首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Firebase数据库中跳过初始OnChildAdded事件触发

如何在Firebase数据库中跳过初始OnChildAdded事件触发
EN

Stack Overflow用户
提问于 2016-09-13 14:56:04
回答 1查看 936关注 0票数 2

我的Firebase数据库中有一个用户子树,它保存用户的基本信息和跟踪/追随者,该子树的结构如下:

代码语言:javascript
复制
"users": {
  "userId-1": { 
    "userName": "Namey McNameface",

    "following": {
      "followingId-1": true,
      "followingId-2": true,
      .
      .
    },
    "followers": {
      "followerId-1": true,
      "followerId-2": true,
      .
      .
    }
  },
  "userId-2": {},
  "userId-3": {},
  .
  .
}

每当有人开始跟踪他/她时,我想向用户的手机发送通知。在我自己的服务器上,我听追随者子树。添加子节点时,用户将看到通知。问题是,在某个时候,我需要部署我的服务器的下一个版本,当我这样做时,OnChildAdded事件将为所有的子级(关注者)触发,所有用户都会看到关于他们的关注者的错误通知开始跟踪他们。

为了解决这个问题,我可以将发送的通知信息存储在我的数据库中,但是这对我来说是一项耗时的工作。

另一种方法是我可以跳过OnChildAdded事件的初始触发,如果这在Firebase数据库中是可行的话。

提前谢谢你。

编辑:

我的服务器使用Java和Spring。这是我的FirebaseService。我正在创建一个UserListener,并开始监听所有用户。

代码语言:javascript
复制
@Service
public class FirebaseService {
    public FirebaseService() {
        UserListener userListener = new UserListener();
        FirebaseDatabase.getInstance().getReference(Tag.USERS).addChildEventListener(userListener);
    }
}

我是UserListener。它创建一个FollowerListener来侦听每个用户的followers子树。

代码语言:javascript
复制
public class UserListener implements ChildEventListener {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        String userId = dataSnapshot.getKey();
        FollowerListener followerListener = new FollowerListener(userId);
        FirebaseDatabase.getInstance().getReference(Tag.USERS).child(userId).child(Tag.FOLLOWERS).addChildEventListener(followerListener);
    }

    @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) {

    }
}

我是FollowerListener。当用户ID被添加到followers时,FollowerListener会发送通知。它基本上得到跟随的用户的FirebaseInstanceId和跟随者的用户名。然后发送通知。

代码语言:javascript
复制
public class FollowerListener implements ChildEventListener {
    private final String followedUserId;

    public FollowerListener(String followedUserId){
        this.followedUserId = followedUserId;
    }

    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        String followerUserId = dataSnapshot.getKey();
        FirebaseDatabase.getInstance().getReference(Tag.USERS).child(followedUserId)
                .addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        User followedUser = dataSnapshot.getValue(User.class);

                        if(followedUser != null){
                            FirebaseDatabase.getInstance().getReference(Tag.USERS).child(followerUserId)
                                    .addListenerForSingleValueEvent(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(DataSnapshot dataSnapshot) {
                                            User followerUser = dataSnapshot.getValue(User.class);

                                            if(followerUser != null){

                                                // Send notification to followed user.

                                                NotificationInfo notificationInfo = new NotificationInfo();
                                                notificationInfo.setTitle("test title");
                                                notificationInfo.setText(followerUser.getScreenName() + " seni takip etmeye başladı.");
                                                notificationInfo.setClickAction(Tag.ACTION_GO_TO_PROFILE);

                                                NotificationData data = new NotificationData();
                                                data.setUserId(followerUserId);

                                                NotificationRequestBean bean = new NotificationRequestBean();
                                                bean.setTo(followedUser.getFirebaseInstanceId());
                                                bean.setBody("test body");
                                                bean.setTitle("test title");
                                                bean.setPriority("normal");
                                                bean.setDelayWhileIdle(false);
                                                bean.setNotification(notificationInfo);
                                                bean.setData(data);

                                                AppUtils.sendNotification(bean);
                                            }
                                        }

                                        @Override
                                        public void onCancelled(DatabaseError databaseError) {

                                        }
                                    });
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
    }

    @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) {

    }
}

问题是,每当我部署服务器时,FollowerListener都会附加到所有用户的followers子树。然后OnChildAdded事件首先为每个跟随者触发。它不应该每次部署服务器时都发送通知。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-16 15:58:47

我为这个问题找到了一个非常简单的解决方案。我刚刚在名为booleanfollowers子树中添加了一个processedByServer字段。所以就变成这样:

代码语言:javascript
复制
"followers": {
  "followerId-1": {
    "processedByServer": true // already processed.
  },
  "followerId-2": {
    "processedByServer": false // not processed yet, but will be.
  },
  .
  .
}

这个processedByServer最初是false,我在服务器中完成了必要的处理(发送通知等)。我将此值更改为true。服务器只需要在此字段为false时进行处理。因此,在我重新部署/重新启动服务器之后,它就不会再发送错误的通知了。

但这一解决方案也有其不利之处:

  1. 我为此增加了一个额外的字段,但我认为没关系。
  2. 当服务器重新启动时,它必须检查followers子树中的所有followers字段,这对于服务器来说可能是一项耗时的工作。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39473099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档