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

Java 如何在满足条件后停止值事件侦听器的侦听,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,例如,在圆圈中搜索用户圆圈如果数据存在,我希望它执行流程1,如果数据不存在,我希望它创建一个,然后执行流程2。。。但如果数据不存在,代码中会发生什么?它将创建一个,然后执行进程2,然后返回,然后在检查后执行进程1。那么,如何在进程2之后停止侦听器呢。 对不起,如果圆圈的例子太模糊,但这是我能想到的最简单的例子 Firebase ref= new Firebase("https://XXXXX.firebaseio.com/circles/"); Query queryRef = ref.orde

例如,在圆圈中搜索用户圆圈如果数据存在,我希望它执行流程1,如果数据不存在,我希望它创建一个,然后执行流程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
         }

    }

您可以使用
addListenerForSingleValueEvent

因为它只听事件一次

i、 在你的情况下

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。全局
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) {}
});
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) {}
});

2。删除侦听器 一旦满足条件,请删除侦听器:

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) {}
});
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
时,这两种解决方案对我来说都很好,但我无能为力。

您需要删除侦听器以停止接收更新。看到了,没错!!如何将其自身删除?您有一个
侦听器
变量。所以
queryRef.removeEventListener(listener)
应该可以做到这一点。好的,它只会侦听一次,但问题是“如何在满足条件后停止值事件侦听器侦听”意味着如果使用“equalTo”(“”)、“orderByChhild”(“”)这样的查询,由于onDataChangeListener是活动的事件,活动已完成,因此我们需要删除的ValueEventListener onDestoyactivity@Gururaj,您的后续评论是正确的。当我遇到同样的问题时,我理解了这种情况。好吧,如果它是一个全局变量,那么这个侦听器可以在OnTestryoy或onStop中删除,正如您所说的。然而,对我有效的方法是:调用queryRef.removeEventListener(这个);当您的条件满足时,从内部进行更改。但这是一个很好的问题,因为我觉得每个Firebase开发人员都必须掌握一些技巧!