![](/img/trans.png)
[英]How to modify variables outside of a function in PHP / better way to do something
[英]How to modify variables outside of their scope in kotlin?
我了解在 Kotlin 中沒有“非局部變量”或“全局變量”之類的東西我正在尋找一種方法來修改 Kotlin 中另一個“范圍”中的變量,方法是使用下面的 ZC1C425268E68385D1ABZA944F:
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
scope 內部記錄結果返回 8)所以很明顯listsize
變量沒有被修改。 我在其他網站上看到了很多關於這個主題的不同帖子,但沒有一個適合我的用例。
我只是想在.addOnSuccessListener
回調中修改listsize
此方法將始終返回 0,因為在方法執行完成后將調用addOnSuccessListener()
偵聽器。 addOnSuccessListener()
是asynchronous
操作的回調方法,如果它只成功,您將獲得該值。
您可以通過更改以下代碼來獲取值:
class Demo {
fun registerListResult() {
var listallinfo = FirebaseStorage.getInstance()
.getReference()
.child("MainTimeline/")
.listAll()
listallinfo.addOnSuccessListener {
listResult -> listsize += listResult.items.size
processResult(listsize)
}
listallinfo.addOnFailureListener {
// Uh-oh, an error occurred!
}
}
fun processResult(listsize: Int) {
print(listResult+"") // you will get the 8 here as you said
}
}
您正在尋找的是一種將一些異步處理橋接到同步上下文的方法。 如果可能的話,(在我看來)在整個代碼庫中堅持使用一個 model(同步或異步)通常會更好。
話雖如此,有時這些情況是我們無法控制的。 我在類似情況下使用的一種方法是引入BlockingQueue
作為數據 pipe 以將數據從異步上下文傳輸到同步上下文。 在您的情況下,這可能看起來像這樣:
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
接口有一個阻塞變體,將用於 pipe 數據從異步上下文(偵聽器)到同步上下文(調用代碼)put()
OnSuccessListener
內的隊列中take()
方法,這將導致該線程阻塞,直到一個值可用如果這對你不起作用,希望它至少能激發一些新的想法!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.