Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove Firebase listener doesn't work Android

I'm adding an event value listener to a reference and when I want to remove it, but it doesn't work.

override fun onStart() {
    super.onStart()
    stateListener =dbReference.stateRef.addValueEventListener(object : ValueEventListener {

        override fun onCancelled(p0: DatabaseError?) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }

        override fun onDataChange(snapshot: DataSnapshot?) {
           //there is my functions
        })
}

override fun onStop() {
    super.onStop()
    dbReference.stateRef.removeEventListener(stateListener)
    Log.d("My_TAG", "$stateListener ")
}

This is the only place I'm adding the event.

after editing (still don't work)

override fun onStart() {
    super.onStart()
    stateListener = object : ValueEventListener {
        override fun onCancelled(p0: DatabaseError?) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
        //One of the phone got flipped
        override fun onDataChange(snapshot: DataSnapshot?) {
        }

    }
    dbReference.stateRef.addValueEventListener(stateListener)

}

override fun onStop() {
    super.onStop()
    Log.d("Life", "onStop")
    dbReference.stateRef.removeEventListener(stateListener)
}
like image 379
Amit Laloush Avatar asked Feb 26 '26 20:02

Amit Laloush


2 Answers

In order to remove a listener, you first need to create it and then attach it to a DatabaseReference object.

val valueEventListener = ValueEventListener() {
    //override fun onDataChange
    //override fun onCancelled
}
dbReference.stateRef.addValueEventListener(eventListener)

So to remove the listener, you need to do it accordingly to the life-cycle of your activity like this:

dbReference.stateRef.removeEventListener(valueEventListener);
  • If you have added the listener in onStart you have to remove it in onStop.
  • If you have added the listener in onResume you have to remove it in onPause.
  • If you have added the listener in onCreate you have to remove it in onDestroy.

But remember onDestroy is not always called.

like image 95
Alex Mamo Avatar answered Feb 28 '26 09:02

Alex Mamo


addValueEventListener doesn't return anything. You just created the listener anonymously. Therefore, your stateListener isn't referring to your listener.

Change your code as below:

class YourClassName:Activity(){    
private lateinit var statelistener: ValueEventListener

override fun onStart() {
    stateListener = ValueEventListener {
        [...]
    }
    dbReference.stateRef.addValueEventListener(stateListener)
}


override fun onStop() {
    super.onStop()
    dbReference.stateRef.removeEventListener(stateListener)
    Log.d("My_TAG", "$stateListener ")
}
}

Now, your unsubscribe code should work. I am not very comfortable with Kotlin yet so pardon the syntax issues but the code above should work.

like image 20
Puneet Avatar answered Feb 28 '26 09:02

Puneet