如何等待监听器完成执行

Max*_*Max 5 android kotlin

我在这里尝试做的是将下载 URL 添加到侦听器内的 ArrayList。添加完所有项目后,再打印 ArrayList。但是,由于侦听器是以异步方式执行的,因此 println 将始终打印一个空的 ArrayList。那么,我的问题是如何使其同步?这意味着 println 语句打印包含项目的 ArrayList。这是我的代码:

@Synchronized
    private fun postOfferNow() {
        val storageRef = storge.reference
        val images = ArrayList<String>()
        for (image in this. takenPicsPaths) {
            val file = Uri.fromFile(File(image))
            val ref = storageRef.child("Images/$offerOwnerID/${file.lastPathSegment}")
            ref.putFile(file).addOnFailureListener {

            }.addOnSuccessListener {
                ref.downloadUrl.addOnCompleteListener {
                    val url = it.result
                    images.add(url.toString()) //here is where I add items to images
                }
            }
        }
        println(images)// this will always print "[]"
    }
Run Code Online (Sandbox Code Playgroud)

小智 1

一个简单的解决方案是:在添加 URL 后检查图像 arrayList 的大小,如果它与 takePicsPaths 中的项目大小相同,则可以开始打印

但请注意,对于此解决方案,您必须保证所有项目都成功上传,以便在上次上传完成后开始打印。如果在您的情况下不能保证这一点,请在循环开始之前声明一个等于 0 的整数计数器,在 onSuccess 侦听器之后添加 OnFailureListener,并在两个侦听器中递增计数器。现在,只要计数器达到所需计数,就开始打印。

在这里我说“无论哪里”因为你可能会达到失败侦听器中的所需计数