我了解在Kotlin中没有诸如“非局部变量”或“全局变量”之类的东西,我正在寻找一种使用以下功能在Kotlin中的另一个“ Scope”中修改变量的方法:
class Listres(){
var listsize = 0
fun gatherlistresult(){
var listallinfo = FirebaseStorage.getInstance()
.getReference()
.child("MainTimeline/")
.listAll()
listallinfo.addOnSuccessListener {
listResult -> listsize += listResult.items.size
}
}
}
listsize的值始终为0(从.addOnSuccessListener
作用域内部记录结果将返回8),因此显然listsize
变量没有被修改。我在其他站点上看到了许多关于此主题的不同文章,但没有一个适合我的用例。
我只想listsize
在.addOnSuccessListener
回调内部进行修改
您正在寻找的是一种将一些异步处理桥接到同步上下文中的方法。如果可能的话,在我的代码库中,最好坚持一种模型(同步或异步)(在我看来)。
话虽如此,有时这些情况是我们无法控制的。我在类似情况下使用的一种方法涉及引入aBlockingQueue
作为数据管道,以将数据从异步上下文传输到同步上下文。在您的情况下,可能看起来像这样:
class Demo {
var listSize = 0
fun registerListResult() {
val listAll = FirebaseStorage.getInstance()
.getReference()
.child("MainTimeline/")
.listAll()
val dataQueue = ArrayBlockingQueue<Int>(1)
listAll.addOnSuccessListener { dataQueue.put(it.items.size) }
listSize = dataQueue.take()
}
}
关键点是:
Queue
接口的阻塞变体将用于将数据从异步上下文(侦听器)管道传输到同步上下文(调用代码)put()
在OnSuccessListener
take()
方法,这将导致该线程阻塞,直到有一个值可用为止如果那对您不起作用,希望它至少会激发一些新想法!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句