【发布时间】:2020-10-26 15:23:27
【问题描述】:
在我的应用程序中,我从 api 获得了一组指向某些图像的 url,并且需要从这些 url 中创建 Bitmap 对象才能在 UI 中显示图像。我看到 android 文档建议使用协程来执行此类异步任务,但我不确定如何正确执行。
在我的 http 客户端使用 OkHttp,我尝试了以下方法:
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)
}
response 是我从我的 API 中返回的,searchResults 是一个 LiveData,用于保存已解析的响应。
另外,这是我从这些网址获取图像的方式:
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())
}
即使每个 fetch 操作都是在一个单独的协程上完成的,它仍然太慢了。有更好的方法吗?如果有一个针对协程进行优化的 http 客户端,我可以使用任何其他 http 客户端,尽管我是 Kotlin 的新手,所以我不知道。
【问题讨论】:
-
首先您应该确定缓慢的原因,这很可能在这段代码之外。是服务器吗?您的互联网连接?
-
bitmap.await()你已经在循环中等待,这将暂停循环直到延迟完成。 -
考虑使用 Picasso 或 Glide 或 Coil,他们会为您下载并缓存图像。
-
@Thomas,我在模拟器中运行我的应用程序,因此可能会导致网络速度变慢。运行分析器表明,实际上网络请求本身需要一些时间,但我的实现运行速度比 Animesh Sahu 提出的要慢
标签: android kotlin okhttp kotlin-coroutines