我有 2 個功能,我需要先完成第一個,然后再完成第二個,但是在一個執行緒上運行它需要很長時間,所以我嘗試像使用 CoroutineScope 一樣運行它,但是即使沒有下載所有影像,第二個功能也會執行.
downloadSkillsImages(context)
addSkillsToDB()
private suspend fun downloadSkillsImages(context: Context) {
for (i in 0 until skills.size) {
CoroutineScope(IO).launch {
try {
val url = fbStorage.reference.child("skillImagesMini").child("${skills[i].skillId}.jpg").downloadUrl.await()
skills[i].skillImage = getBitmapFromUri(url, context)
}catch (e: Exception){
//image not found, nothing happens
}
}
}
}
uj5u.com熱心網友回復:
這就是coroutineScope
作用域函式的用途。它等待所有子協程完成。
private suspend fun downloadSkillsImages(context: Context) = coroutineScope {
for (i in skills.indices) {
launch(Dispatchers.IO) {
try {
val url = fbStorage.reference.child("skillImagesMini").child("${skills[i].skillId}.jpg").downloadUrl.await()
skills[i].skillImage = getBitmapFromUri(url, context)
} catch (e: Exception){
//image not found, nothing happens
}
}
}
}
注意,你只需要指定 Dispatchers.IO 如果getBitmapFromUri
是一個阻塞函式。如果它是一個掛起函式,那么這個子協程中沒有任何東西是阻塞的,所以使用什么調度程式來呼叫它并不重要。
由于您希望您的協程全部完成并默默地忽略那些失敗的協程,您可以通過使用supervisorScope
而不是簡化這一點,coroutineScope
這樣您就不需要 try/catch。supervisorScope
即使它的一些孩子失敗,也會成功完成。
private suspend fun downloadSkillsImages(context: Context) = supervisorScope {
for (i in skills.indices) {
launch(Dispatchers.IO) {
val url = fbStorage.reference.child("skillImagesMini").child("${skills[i].skillId}.jpg").downloadUrl.await()
skills[i].skillImage = getBitmapFromUri(url, context)
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/463420.html