Android 听单个事件的简洁方式
是否有一种简洁的方法可以只添加Android 听单个事件的简洁方式,android,firebase,kotlin,Android,Firebase,Kotlin,是否有一种简洁的方法可以只添加子项或任何事件?现在我必须做以下事情,这看起来很愚蠢 ref.addChildEventListener(object : ChildEventListener { override fun onCancelled(p0: DatabaseError) {} override fun onChildChanged(p0: DataSnapshot, p1: String?) {} override fun onChildMoved(p0: D
子项
或任何事件?现在我必须做以下事情,这看起来很愚蠢
ref.addChildEventListener(object : ChildEventListener {
override fun onCancelled(p0: DatabaseError) {}
override fun onChildChanged(p0: DataSnapshot, p1: String?) {}
override fun onChildMoved(p0: DataSnapshot, p1: String?) {}
override fun onChildRemoved(p0: DataSnapshot) {}
override fun onChildAdded(p0: DataSnapshot, p1: String?) {
subscriber.onNext(Value.parse(unitName, varName, p0))
}
})
在您的情况下,通常将其所有方法称为适配器的模式的名称:
ref.addChildEventListener(object : ChildEventAdapter {
override fun onChildAdded(p0: DataSnapshot, p1: String?) {
subscriber.onNext(Value.parse(unitName, varName, p0))
}
})
(接口)适配器类是一个用空方法实现接口的类,因此您可以选择要覆盖的方法
object EmptyChildEventListener : ChildEventListener {
override fun onCancelled(p0: DatabaseError) {}
override fun onChildChanged(p0: DataSnapshot, p1: String?) {}
override fun onChildMoved(p0: DataSnapshot, p1: String?) {}
override fun onChildRemoved(p0: DataSnapshot) {}
override fun onChildAdded(p0: DataSnapshot, p1: String?) { }
}
ref.addChildEventListener(object : ChildEventListener by EmptyChildEventListener {
override fun onChildAdded(p0: DataSnapshot, p1: String?) {
subscriber.onNext(Value.parse(unitName, varName, p0))
}
})
编辑:但是你可以这样改进
inline fun DatabaseReference.onChildAdded(crossinline added: (DataSnapshot, String?) -> Unit) {
this.addChildEventListener(object : ChildEventListener by EmptyChildEventListener {
override fun onChildAdded(p0: DataSnapshot, p1: String?) = added(p0, p1)
})
})
现在你可以做了
ref.onChildAdded { p0, p1 ->
subscriber.onNext(Value.parse(unitName, varName, p0))
}
您可以创建自己的抽象类来实现ChildEventListener,但不提供onChildAdded的实现:
abstract class ChildAddedEventListener : ChildEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onChildMoved(p0: DataSnapshot, p1: String?) {
}
override fun onChildChanged(p0: DataSnapshot, p1: String?) {
}
override fun onChildRemoved(p0: DataSnapshot) {
}
}
然后,将ChildAddedEventListener子类化,并提供所需的实现:
class MyChildAddedEventListener: ChildAddedEventListener {
override fun onChildAdded(p0: DataSnapshot, p1: String?) {
// your code here
}
}
这样,在将其添加到查询时,可以将其用作内联对象表达式:
query.addChildEventListener(object : ChildAddedEventListener() {
override fun onChildAdded(p0: DataSnapshot, p1: String?) {
subscriber.onNext(Value.parse(unitName, varName, p0))
}
})
这是我从手机中收集到的最好的信息了,我也许可以给你写点交叉线的东西。检查我从电脑上修改的答案。这很糟糕,因为你仍然需要为每1GB下载一次儿童更改、一次儿童移动和一次儿童移动的数据收取1美元的费用。在iOS和Web中,您只能侦听特定的子事件,如onChildAdded。只有在安卓系统中,您才被迫收听所有子事件。你能核实一下这个限制吗?Android Firebase SDK不像iOS和Web Firebase SDK那样工作,我必须创建另一种(非常低效的方式)来专门为Android设置侦听器。我只想侦听onchildaded和onChildRemoved,而不是onChildChanged。现在,我必须在推送孩子时在某处放置一个标志,以便客户机可以在添加或删除孩子时重新加载整个列表。我无法设置childEventListener,因为如果我设置了它,我将为onChildChanged收取费用。我在子树中有一个单独的onChildChanged侦听器。Android SDK ChildListener没有给开发人员任何灵活性,而且它与iOS和Web平台不一致。@如果您对Firebase API有反馈或建议,我建议将其发送给Firebase支持部门。否决一个答案不会改变今天事情运作方式的现实。我真的很感谢你对这一限制的确认。非常感谢。我会在我的终端上打补丁,为安卓系统提供定制解决方案——在我的终端上做更多的工作。每当我从列表中推送或删除时,我可以模拟childAdded和childDeleted by,设置时间戳标志,当该时间戳标志小于当前客户端本地时间戳时,刷新整个列表。然而,没有什么比Firebase更伟大了!正如你所说,我也在提交支持请求。谢谢你所做的一切。这是一个很好的问题。你不应该被强迫去听所有的子事件,因为它会给你下载的数据带来额外的费用。在iOS和Web Firebase SDK中,您可以侦听任何特定的子事件,但在Android Firebase SDK中,您必须侦听所有子事件。这似乎是Android Firebase SDK中的一个bug。