Android 当我添加一个子对象时,侦听器多次调用,而我不';我不知道为什么。。这是我的密码
我正在使用MVC,我在我的应用程序中使用firebase实时数据库。我正在使用Android 当我添加一个子对象时,侦听器多次调用,而我不';我不知道为什么。。这是我的密码,android,kotlin,firebase-realtime-database,Android,Kotlin,Firebase Realtime Database,我正在使用MVC,我在我的应用程序中使用firebase实时数据库。我正在使用addListenerForSingleValueEventlistner在firebase中添加数据 我面临的问题 侦听器被多次呼叫,电话停止工作 override-fun-insertreport(reports:reports,userItem:userItem,uid:String,responseCallback:responseCallback){ userRef.addListenerForSingleV
addListenerForSingleValueEvent
listner在firebase中添加数据
我面临的问题
侦听器被多次呼叫,电话停止工作
override-fun-insertreport(reports:reports,userItem:userItem,uid:String,responseCallback:responseCallback){
userRef.addListenerForSingleValueEvent(对象:ValueEventListener{
覆盖数据更改(快照:DataSnapshot){
var report=HashMap()
reports.id=userRef.push().key.toString()
融洽关系[融洽关系.id.toString()]=融洽关系
userItem.relapt=融洽关系
userRef.child(uid)
.child(“融洽关系”).child(融洽关系.id!!)
.setValue(融洽关系)
responseCallback.success()
userRef.removeEventListener(此)
}
覆盖已取消(错误:DatabaseError){
}
})
}
根据您当前的代码,这不是无限循环的来源
但是,无论如何,您不需要值事件侦听器来完成您要做的事情
override fun insertRapport(rapports: Rapports, uid: String, responseCallback: ResponseCallback) {
var newRapportsRef = userRef
.child(uid)
.child("rapports")
.push()
rapports.id = newRapportsRef.key
newRapportsRef.setValue(rapports)
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
responseCallback.success()
} else {
responseCallback.failed()
}
})
}
因为Firebase库已经返回了,所以不需要使用ResponseCallback
。对于您在任务上执行的常见操作,还有一个简单的解决方案
override fun insertRapport(rapports: Rapports, uid: String) {
var newRapportsRef = userRef
.child(uid)
.child("rapports")
.push()
rapports.id = newRapportsRef.key
return newRapportsRef.setValue(rapports)
}
或者您可以使用Kotlin的数据库引用。CompletionListener
变体:
override fun insertRapport(rapports: Rapports, uid: String, listener: DatabaseReference.CompletionListener?) {
var newRapportsRef = userRef
.child(uid)
.child("rapports")
.push()
rapports.id = newRapportsRef.key
newRapportsRef.setValue(rapports, listener)
}
如果userItem.rapport
也需要更新,您应该在它自己的监听器中的其他地方进行更新
userItem = /* ... */
// could use a ChildEventListener
ValueEventListener rapportListener = object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
GenericTypeIndicator<Map<String, Rapports>> t = new GenericTypeIndicator<Map<String, Rapports>>() {};
userItem.rapport = snapshot.getValue(t)
}
override fun onCancelled(error: DatabaseError) {
// TODO: Handle errors
}
}
// attach the listener (in onCreate, etc.)
userRef
.child(uid)
.child("rapports")
.addValueEventListener(rapportListener)
// later, detach the listener (in onDestroy, etc)
userRef
.child(uid)
.child("rapports")
.removeEventListener(rapportListener)
userItem=/**/
//可以使用ChildEventListener
ValueEventListener=对象:ValueEventListener{
覆盖数据更改(快照:DataSnapshot){
GenericTypeIndicator t=新的GenericTypeIndicator(){};
userItem.report=snapshot.getValue(t)
}
覆盖已取消(错误:DatabaseError){
//TODO:处理错误
}
}
//附加侦听器(在onCreate等中)
用户参考
.child(uid)
.儿童(“融洽关系”)
.addValueEventListener(报告侦听器)
//稍后,分离侦听器(在onDestroy等中)
用户参考
.child(uid)
.儿童(“融洽关系”)
.removeEventListener(监听器)
当日志停止工作时,你能显示日志吗?我尝试了你的代码,但它是相同的loop@MouadhLaabidi这正是我在第一行说的。你需要提供剩下的代码来找出它在哪里。。谢谢你我发现了问题不在那里但就像你说的