如何在满足条件后停止值事件侦听器的侦听

时间:2016-04-04 20:18:41

标签: java android firebase firebase-realtime-database

例如,如果数据存在则在圈子中搜索用户圈我希望它处理过程1并且如果数据不存在我想要它创建一个然后DO过程2 ...但是如果数据在此代码中会发生什么不存在它会创建一个然后执行流程2然后返回然后检查后执行流程1。那么如何在进程2之后停止监听器。 对不起,如果圆圈示例太模糊,但这是我能想到的最简单的例子。

Firebase ref= new Firebase("https://XXXXX.firebaseio.com/circles/");
Query queryRef = ref.orderByChild("circalename").equalTo(user.circalename);
ValueEventListener listener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot datasnapshot) {
        if (datasnapshot.exists()) { // I don't want to get back here after 
                                      //creating the data in the else statement 
             // DO process 1
         }

         // if my data doesnt exist I will create one after that STOP listening 
         else {
             // create circle 
             // do process 2
         }

    }

2 个答案:

答案 0 :(得分:8)

您可以使用addListenerForSingleValueEvent

因为它只听一次事件

即。在你的情况下

queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {
        if (datasnapshot.exists()) {
            // code if data exists
        } else {
            // code if data does not  exists
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

答案 1 :(得分:3)

尽管Shubham Arora's answer是这种情况的最佳解决方案,但我将向您展示如何使用这两个非常简单的解决方案完全按照您的要求进行操作:


1。全球boolean

创建全局boolean并在满足条件后进行更改:

query.addListenerForSingleValueEvent(new ValueEventListener() {
    boolean processDone = false;

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists() && !processDone) {
            // do process 1   
        } else {
            // do process 2
            processDone = true;
        }
    }

    @Override public void onCancelled(DatabaseError databaseError) {}
});


2。删除侦听器

符合条件后移除听众:

query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            // do process 1   
        } else {
            // do process 2
            query.removeEventListener(this);
        }
    }

    @Override public void onCancelled(DatabaseError databaseError) {}
});


当我使用ChildEventListener并且Shubham Arora's answer无法帮助时,这两种解决方案都适用于我。