问题描述
我具有应更新列表的代码,一旦与Firebase数据库中与该通道相关的所有节点都被删除(除非删除了/ channellist下的该通道节点之后,则不删除该节点),则该代码应先更新列表适配器,然后将notifyDataSetChanged()通知列表适配器,我随后的/ channellist子侦听器无法访问ref.child(“ / channellist / $ channelname”)下的数据。因此出于某些原因,我无法访问/ channellist。
您可以看到/ channel节点下没有channel2,因为它已被删除,并且由于某种原因,channellist下的channel2未被删除。
fun deleteChannel() {
Log.d("channeltodelete",channelToDelete)
val messageKeysToDelete = ArrayList<String>()
fb.child("/channel/$channelToDelete/messages")
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(data: DataSnapshot) {
if (!data.exists()) {
deleteChannelHelper(channelToDelete)
fb.child("/channel/$channelToDelete").removeValue()
return
}
// Deletes the messages under /message
val messagemap = data.getValue(typeindicator2)!!
for (key in messagemap) {
messageKeysToDelete.add(key.key)
}
for (key in messageKeysToDelete) {
fb.child("message/$key").removeValue()
}
// DeleteChannelHelper deletes under user/channels
deleteChannelHelper(channelToDelete)
var fb2 = FirebaseDatabase.getInstance().reference
fb.child("/channel/$channelToDelete").removeValue()
**// This is the line of code that doesn't work
fb2.child("/channellist/$channelToDelete").removeValue()**
}
override fun onCancelled(databaseError: DatabaseError) {
// report/log the error
}
}
fun processChannelListData(data: DataSnapshot) {
Log.d("channellistlistener",data.key + ": " + data.value)
val channelnames = data.children.toMutableList()
var channels = ArrayList<String>()
var channelsToDelete = ArrayList<String>()
for (channel in channelnames) {
channels.add(channel.key.toString())
}
Log.d("channelnameslistener",channels.toString())
// If a channel was added
for (channel in channels) {
if (channel !in channelList) {
channelList.add(channel)
}
}
// If a channel was deleted
for (channel in channelList) {
if (channel !in channels) {
channelsToDelete.add(channel)
}
}
channelList.removeAll(channelsToDelete)
Log.d("chanList removeall",channelList.toString())
myAdapter.notifyDataSetChanged()
}
我要注意的是,放置在/ channellist上的ChildEventListener不仅在/ channellist节点上触发多次,在所有子节点上也会触发一次原因,并弄乱了全局channelList,因为如果最后访问的节点是test1,则它看起来像
2020-09-14 16:26:18.734 24448-24523/com.example.treechat D/channellistlistener: test1: -MGyjrKRLmc-wPLAjvR-
2020-09-14 16:26:18.734 24448-24523/com.example.treechat D/channelnameslistener: []
...
2020-09-14 16:26:18.734 24448-24523/com.example.treechat D/chanList removeall: []
如果代码只是顶级节点,那就没问题了
2020-09-14 16:26:18.733 24448-24520/com.example.treechat D/channellistlistener: channellist: {channel1=-MHCK1wp8mBUi_bJzxZ-,channel2=-MHdam_k2no7ZLtUYTIU,test1=-MGyjrKRLmc-wPLAjvR-}
2020-09-14 16:26:18.733 24448-24520/com.example.treechat D/channelnameslistener: [channel1,channel2,test1]
...
2020-09-14 16:26:18.733 24448-24520/com.example.treechat D/chanList removeall: [channel1,test1]
通过这种方式,我在创建频道时访问/ channellist不会遇到问题,因为您可以看到节点创建得很好。但是由于某种原因,我在执行该操作时该应用会崩溃,而不是从ChannelListActivity-> ChannelActivity转到,而是从ChannelListActivity-> ChannelActivity-> mini-crash-> ChannelListActivity退出。我将其发布在一个单独的问题中,但是没有致命的异常日志。
解决方法
我恢复为/ channellist使用ValueEventListener而不是ChildEventListener。
我发现,使用HashMap