Firebase удалить ValueEventListener не удаляет слушателя - PullRequest
0 голосов
/ 04 мая 2019

У меня есть 2 слушателя базы данных в реальном времени Firebase: слушатель соединения и слушатель данных.Я объявил эти переменные глобально с ключевым словом val и в блоке init{} я их инициализировал.Сказав, что они не должны быть изменены.Итак, также в моем блоке init я присоединяю слушателя Соединения к DatabaseReference.Если устройство подключено к Firebase, оно вызывает метод для подключения прослушивателя данных.

Итак, в чем проблема?
Поскольку теоретически слушатели остаются неизменными, я могу прикрепить их и удалить при любой проблеме.Но проблема в том, что после того, как слушатель прикреплен к ссылке, я больше не могу их удалить - или, другими словами, после удаления слушателя из справочных данных все еще выбирается.

Код:

Класс Firebase, к которому подключены слушатели:

private val REFERENCE = "reference"

private var mDatabase: FirebaseDatabase? = null
private val mDataReference: DatabaseReference
private val mValueChangedListener: ValueEventListener

private var mModelChanged: onModelChanged? = null

init {
    if (mDatabase == null) {
        mDatabase = FirebaseDatabase.getInstance()
    }
    mDataReference = mDatabase!!.getReference(REFERENCE)

    /**
     * Listener listening for data changes
     */

    mValueChangedListener = object : ValueEventListener {
        override fun onDataChange(p0: DataSnapshot) {
            mModelChanged?.onDataSetChanged(p0)
        }

        override fun onCancelled(p0: DatabaseError) {
            mModelChanged?.onConnectionChanged(false)
            Log.e("Database error", p0.code.toString())
        }
    }
}

fun attachListener(){
    mDataReference.addValueEventListener(mValueChangedListener)
    Log.d("Attach listener", "attached")
}

fun detachListener(){
    mDataReference.removeEventListener(mValueChangedListener)
    Log.d("Detach listener", "detached")

}

Репозиторий, который вызывает метод attachListener () или detachListener () из вышеприведенного класса, а также настраивает интерфейс onModelChanged.

fun attachAdapter(){
    mModel.attachListener()
}

fun detachAdapter(){
    mModel.detachListener()
}

И Activity, которая вызывает репо в onResume() и onPause()

override fun onResume() {
    super.onResume()
    mRepository.attachAdapter()
    Log.i("onResume", "called")
}


override fun onPause() {
    super.onPause()
    mRepository.detachAdapter()
    Log.i("onPause", "called")
}

Что я делаю не так?Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...