Firebase + Android - Notifications ChildAdded - 如何只获得新孩子?

jsf*_*cha 8 android android-service firebase

我正在尝试在我的应用中设置Android服务,以便在Firebase Ref中侦听新的Child,并在发生这种情况时抛出通知.

我遇到了问题,因为addChildEventListener onChildAdded显然每次存在的记录都会被调用一次,然后实际上只会听新的孩子.

这个答案中, @ kato说如果addChildEventListener被调用就像ref.endAt().limit(1).addChildEventListener(...)只获得新添加的记录一样.

它实际上一次只能获得一条记录(我猜limit(1))但在收听添加的记录之前它仍然会获得一条记录.

这是一些代码:

在onCreate()中初始化监听器:

@Override
public void onCreate() {
    super.onCreate();
    this.handler = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            AllowedGroup ag = dataSnapshot.getValue(AllowedGroup.class);

            postNotif("Group Added!", ag.getName());
        }
        ...rest of needed overrides, not used...
Run Code Online (Sandbox Code Playgroud)

我正在使用它AllowedGroup.class来存储记录,以及postNotif构建和发布通知.这部分按预期工作.

然后,onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    this.f = new Firebase(FIREBASE_URL).child("users").child(this.currentUserUid).child("allowedGroups");
    f.endAt().limit(1).addChildEventListener(handler);
    return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)

在实际收听新添加的孩子之前,它仍会返回一个存在的记录.

我也试过按时间戳查询,如下:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    this.f = new Firebase(FIREBASE_URL).child("users").child(this.currentUserUid).child("allowedGroups");
    f.startAt(System.currentTimeMillis()).addChildEventListener(handler);
    return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)

希望它只能在服务启动后获取记录集.它没有获得现有记录,但甚至没有新添加的孩子.

编辑:

我还想到了一些事情,比如先将所有存在的记录放入记忆中,如果记录带来的记录onChildAdded在先前收集的列表中不存在,则有条件地发布通知,但这看起来有点像矫枉过正,并认为可能是更简单(更友好的API)方式,我是对的吗?

任何人都能为我提供一些见解吗?我无法在官方文档或任何StackOverflow问题或教程中找到任何内容.

谢谢.

mma*_*oub 0

对我来说,逻辑是具有值(例如“状态”),在决定它是真正的新记录还是旧记录之前需要对其进行验证,然后我将“状态”设置为不同的值,这样我就不会得到下次再说:

@Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildKey) {

                if(dataSnapshot.hasChildren()) {

                    String Id = (String) dataSnapshot.child("user_id").getValue();
                    String status = (String) dataSnapshot.child("status").getValue();

                    if (Id != null && Id.equals(storedId) && status != null && status.equals("created")) {
                        Log.d("INCOMING_REQUEST", "This is for you!");
                        sessionsRef.child(dataSnapshot.getKey()).child("status").setValue("received");
                    }

                }


        }
Run Code Online (Sandbox Code Playgroud)