【问题标题】:Recyclerview data not fetched with coroutinesRecyclerview 数据未通过协程获取
【发布时间】:2020-08-20 09:05:26
【问题描述】:

我正在尝试使用协程将 Firebase 存储数据显示到 recyclerview。当我这样做时,它不显示图像,它显示空的recyclerview。 这是代码

private var imageList = ArrayList<ImageItem>()

onCreate() {
    ....
    CoroutineScope(Dispatchers.Main).launch {
        getImages()
        updateAdapter()
    }

}

private suspend fun getImages() =
    withContext(Dispatchers.IO) {
        storageReference.listAll().addOnSuccessListener { listResult ->
            listResult.items.forEach { storageRef ->
                storageRef.downloadUrl.addOnSuccessListener {
                    imageList.add(ImageItem(it))
                }
            }
        }
}

private suspend fun updateAdapter() {
    withContext(Dispatchers.Main) {
        adapter.notifyDataSetChanged()
    }
}

当我将 delay(1000) 放在 getImages() 的末尾时,数据会正确显示。 请帮忙

【问题讨论】:

  • addOnSuccessListener 不会同时运行,协程将在完成之前退出。你可以在 forEach 循环之后调用updateAdapter
  • 如果您不喜欢将他的 updateAdapter 放在回调中,请告诉我storageReference.listAll() 的类型以进一步帮助您。

标签: android firebase kotlin android-recyclerview


【解决方案1】:

addOnSuccessListener 不会在分配的同时被调用,协程将在完成之前退出。你可以在 forEach 循环之后调用updateAdapter

示例:

// onCreate
CoroutineScope(Dispatchers.Main).launch {
    getImages()
}

private suspend fun getImages() =
    withContext(Dispatchers.IO) {
        storageReference.listAll().addOnSuccessListener { listResult ->
            listResult.items.forEach { storageRef ->
                storageRef.downloadUrl.addOnSuccessListener {
                    imageList.add(ImageItem(it))
                }
            }
            updateAdapter()
        }
    }

如果您喜欢使用当前使用的相同架构,也可以使用suspendCoroutine

// onCreate
CoroutineScope(Dispatchers.Main).launch {
    getImages()
    updateAdapter()
}

private suspend fun getImages() =
    withContext(Dispatchers.IO) {
        suspendCoroutine { cont ->
            storageReference.listAll().addOnSuccessListener { listResult ->
                listResult.items.forEach { storageRef ->
                    storageRef.downloadUrl.addOnSuccessListener {
                        imageList.add(ImageItem(it))
                    }
                }
                cont.resume(Unit)
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2022-10-18
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多