Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当我添加一个子对象时,侦听器多次调用,而我不';我不知道为什么。。这是我的密码_Android_Kotlin_Firebase Realtime Database - Fatal编程技术网

Android 当我添加一个子对象时,侦听器多次调用,而我不';我不知道为什么。。这是我的密码

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

我正在使用MVC,我在我的应用程序中使用firebase实时数据库。我正在使用
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这正是我在第一行说的。你需要提供剩下的代码来找出它在哪里。。谢谢你我发现了问题不在那里但就像你说的