Firebase实时Android-如何处理不断调用的回调



我有以下代码,正如您所看到的,我添加了一个delta时间,以避免频繁更新UI。

我怎样才能用一种奇特的方法解决这个问题?有没有一种方法可以强制延迟addValueEventListener更新,比如说M毫秒,而没有我的delta解决方案?

val db = FirebaseDatabase.getInstance().reference.child("array_constantly_updated")
val delta = 1200L
var lastUpdate = 0L
db.addValueEventListener(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
if (System.currentTimeMillis()-lastUpdate>=delta) {
lastUpdate = System.currentTimeMillis()
} else {
return
}
//update UIView ...
//update UIView 2 ...
//update UIView 3 ...
//update UIView 4 ...
//update more views etc 
//at some point is too much work for UI Thread
}
}

我认为您可以使用Coroutines在作业上执行事务。

val job = launch(Dispatchers.Default) {
// operation
}
delay(1300L) // delay a bit
// job.cancel() // cancels the job

是的,@snorlax的答案很好。

val job = Globalscope.launch(Dispathers.Default) {
val db = FirebaseDatabase.getInstance().reference.child("array_constantly_updated")
val delta = 1200L
var lastUpdate = 0L
while (true) {
db.addValueEventListener(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
lastUpdate = System.currentTimeMillis()
withContext(Dispatchers.Main) {
//USE THIS BLOCK FOR ANY UI STUFF ONLY
//update UIView ...
//update UIView 2 ...
//update UIView 3 ...
//update UIView 4 ...
//update more views etc 
//at some point is too much work for UI Thread    
}
}
}
delay (1200)
}
}

它的作用是每1200毫秒执行一次,不需要检查delta时间。如果你想停止使用,

job?.cancel

这将清除作业,并且代码不再在GlobalScope的协同程序中执行。

最新更新