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

toi*_*345 3 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
         }

    }
Run Code Online (Sandbox Code Playgroud)

Shu*_*ora 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) {

    }
});
Run Code Online (Sandbox Code Playgroud)

  • 好的,它会侦听一次,但是问题是“如何在满足条件后如何停止值事件侦听器的侦听”意味着如果使用带有'equalTo(“”)','orderByChhild(“”)'的查询,如何删除ValueEventListener这是因为onDataChangeListener是活动事件,因此活动已结束,因此我们需要删除Activity的ValueEventListener onDestoy (2认同)

Hug*_*sos 5

尽管Shubham Arora 的答案是这种情况下的最佳解决方案,但我将向您展示如何使用这两个非常简单的解决方案来完全满足您的要求:


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) {}
});
Run Code Online (Sandbox Code Playgroud)


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) {}
});
Run Code Online (Sandbox Code Playgroud)


当我使用时,这两种解决方案对我来说都很好用,ChildEventListener而Shubham Arora 的回答也无济于事。