当我添加一个孩子时,听众多次调用,我不知道为什么..有我的代码



我使用MVC,在我的应用程序中使用firebase实时数据库。我正在使用addListenerForSingleValueEventlistner在firebase中添加数据。

我面临的问题

听众被多次呼叫,电话停止工作

override fun insertRapport(rapports: Rapports,userItem: UserItem,uid: String,responseCallback: ResponseCallback) {
userRef.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
var rapport = HashMap<String, Rapports>()
rapports.id = userRef.push().key.toString()
rapport[rapports.id.toString()] = rapports
userItem.rapport = rapport
userRef.child(uid)
.child("rapports").child(rapports.id!!)
.setValue(rapports)
responseCallback.success()
userRef.removeEventListener(this)
}
override fun onCancelled(error: 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库已经返回了一个Task对象,所以不需要使用ResponseCallback。还有一个Tasks实用程序类,用于对任务执行常见操作。

override fun insertRapport(rapports: Rapports, uid: String) {
var newRapportsRef = userRef
.child(uid)
.child("rapports")
.push()
rapports.id = newRapportsRef.key
return newRapportsRef.setValue(rapports)
}

或者你可以使用Kotlin的DatabaseReference.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)

相关内容

最新更新