在我的应用程序中,我从一个API获取一组图片的URL并需要使用这些URL创建 Bitmap 对象,以便能够在UI中显示图像。我看到Android文档建议使用协程来执行此类异步任务,但我不确定如何正确地实现它。
使用OkHttp作为我的HTTP客户端,我尝试了以下方法:
<code>GlobalScope.launch {
val gson = Gson();
val parsedRes = gson.fromJson(
response.body?.charStream(),
Array<GoodreadsBook>::class.java
);
// Create the bitmap from the imageUrl
for (i in 0 until parsedRes.size) {
val bitmap =
GlobalScope.async { createBitmapFromUrl(parsedRes[i].best_book.image_url) }
parsedRes[i].best_book.imageBitmap = bitmap.await();
}
searchResults.postValue(parsedRes)
}
</code>
response
是我从 API 返回的内容,searchResults
是一个包含解析后响应的 LiveData
。
同时,以下是我如何从这些 URL 获取图像:
suspend fun createBitmapFromUrl(url: String): Bitmap? {
val client = OkHttpClient();
val req = Request.Builder().url(url).build();
val res = client.newCall(req).execute();
return BitmapFactory.decodeStream(res.body?.byteStream())
}
尽管每个获取操作都在单独的协程中执行,但速度仍然太慢。有更好的方法吗?如果有针对协程进行优化的其他http客户端,我可以使用它,但我是Kotlin新手,不知道有哪些。
bitmap.await()
你在循环中使用了await,这会暂停循环直到该deferred完成。 - Animesh Sahu