Firebase Realtime Database是否可以在调用侦听器时删除侦听器

时间:2018-06-21 18:00:42

标签: android firebase firebase-realtime-database

因此,我正在使用Firebase实时数据库,并且希望在满足特定条件时立即删除侦听器。这是我的代码:

final DatabaseReference forRequests = FirebaseDatabase.getInstance().getReference(Common.requests + "/" + FirebaseAuth.getInstance().getUid());

   listenForRequests = forRequests.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            pickuprequest.riderUID = (String) dataSnapshot.child(Common.riderUID).getValue();
                if (pickuprequest.riderUID != null) {
                        forRequests.removeEventListener(listenForRequests);
                        showRequestOnMap(forRequests);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getCode());
        }
    });
}

listenForRequests是一个全局变量。我只是想知道这段代码是否可以工作,或者是否有更好的解决方案,因为我觉得它很hacky。

2 个答案:

答案 0 :(得分:0)

我不能真正说出您的条件到底想表达什么,但是如果您一次只想从数据库中获取一个值(而不必听其随时间的变化),则可以简单地使用{{3 }},以获取数据库中节点的单个快照。

如果您正在等待一个以前不存在的值出现,并且想要在出现该值时停止监听,那么您正在做的事情就很好了。但是您可能想更仔细地听感兴趣的孩子,而不是其父母。

答案 1 :(得分:0)

当您要等待特定的值时,您的代码对我而言非常惯用。

实际上,我的gist on waiting for an initial value中的代码非常相似:

mListener = ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        if (snapshot.exists()) {
            System.out.println("The value is now "+snapshot.getValue());
            ref.removeEventListener(mListener);
        }
    }
    ...