【发布时间】:2020-11-28 17:00:53
【问题描述】:
在片段的onCreateView() 方法中,我将3 个valueEventListeners 附加到firebase 数据库中不同的、互斥的位置。每当引用处的数据更新时,它们都会异步触发。我的示例代码如下所示:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
listner1 = ref1.addCustomValueEventListener {
list1.clear()
// do some operation and populate list1
rewriteMainData()
}
listner2 = ref2.addCustomValueEventListener {
list2.clear()
// do some operation and populate list2
rewriteMainData()
}
listner3 = ref3.addCustomValueEventListener {
list3.clear()
// do some operation and populate list3
rewriteMainData()
}
}
private fun rewriteMainData() {
mainList.clear()
mainDbReference.addCustomListenerForSingleValueEvent {
// compare the values present here with values in list1, list2, list3
// populate mainList with appropriate values
// notifyAdapterDataSetChanged
}
return
}
// EXTENSION FUNCTION
internal inline fun DatabaseReference.addCustomValueEventListener(crossinline onDataChange: (DataSnapshot) -> Unit) =
addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
onDataChange(snapshot)
}
override fun onCancelled(error: DatabaseError) {
Log.e(TAG, "onCancelled: ", error.toException())
}
})
然而,在这个例子中,如果一个监听器紧接着另一个被触发,那么rewriteMainData() 将被调用两次。届时,mainList 将被两个回调同时写入。解决此问题的一种方法是使用ReentrantLock 的实例来避免同时写入。但这使得最新的调用要等到之前的调用完成,这是多余的,因为所有数据都将被清除和重写。
因此,有什么方法可以知道何时调用 rewriteMainData() 以及它是否已经在运行,那么只需中止并使用更新的列表重新启动函数?
【问题讨论】:
标签: kotlin firebase-realtime-database callback kotlin-coroutines