繁体   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