簡體   English   中英

如何在 kotlin 中修改其 scope 之外的變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM