我对Firebase实时数据库有2个侦听器:连接侦听器和数据侦听器。我用关键字val
全局声明了这些变量,并在init{}
块中初始化了它们。话虽如此,不应该进行更改。因此,同样在我的init
块中,我将Connection侦听器附加到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()
}
“活动”,它在onResume()
和onPause()
中调用回购
override fun onResume() {
super.onResume()
mRepository.attachAdapter()
Log.i("onResume", "called")
}
override fun onPause() {
super.onPause()
mRepository.detachAdapter()
Log.i("onPause", "called")
}
我在做什么错?预先感谢!