У меня есть 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")
}
Что я делаю не так?Заранее спасибо!