0

我正在从数据库中加载大约 10 个位图,但将来可能会更多。

这总共需要大约 3 秒,我想改进一下,因为用户需要等到加载完成。(加载发生在一个AsyncTask

这是我的代码:

 Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());

这是在我从数据库加载 JSONArray 的循环中,包括此图像(url 是指向图像的有效直接链接)。

我记录了加载所有内容所需的毫秒数,一次迭代大约需要 350 毫秒,但大约 300 毫秒只是转换。

有什么办法可以改善这一点吗?就像不是每次都创建一个新的位图对象?

4

2 回答 2

1

为什么不添加缓存功能?加载图像时,您将首先尝试从缓存中加载它。如果图像在那里,您应该立即拥有它。

我正在使用LRUCache兼容性包。

除此之外,从数据库加载图像总是会耗费时间和资源。您必须先查找,获取数据,然后执行解码。根据持久化的数据类型和图像的大小,出现这些延迟是正常的。出于这个原因,为什么不将图像保存在 SD 卡或应用程序文件结构中的任何位置?我正在使用DiskLRUCache这个。

编辑:我现在注意到您的图像来源是网络服务。那更好:构造一个两层缓存:内存缓存和磁盘缓存。

所以获取图像就可以了:

  1. 检查图像是否在内存中:是的,您立即拥有它。
  2. 检查图像是否在 sdcard/app 文件结构中:是的,您几乎立即拥有它
  3. 从网络下载图像。但即使在这里,如果您可以访问该服务,您也可以进行一些改进。在服务器端使用 API 来根据需要调整图像大小。在服务器端缓存这些调整大小的图像。这样,您将优化下载速度和客户端应用程序内存。或者,如果您无权访问该服务,请构建您自己的代理服务来执行此动态调整大小并改为调用该服务。
于 2013-07-25T08:04:59.510 回答
0

您的问题是每个连接都是由自己处理的,这意味着每个图像都会创建一个新的 TCP 连接来获取数据,然后再次关闭连接。

您可以尝试使用线程一次加载多个图像。大多数时间在创建连接时都会丢失,并且您将每次都等待的请求序列化。如果您使用线程,则可以减少图像加载的完整时间,因为连接创建是并行的。

另一种选择是使用专用的 HTTP 客户端库。这可以更好地处理连接,因为它们只打开一次 TCP 连接,然后通过这个单一连接发送多个请求。TCP 连接的开销只有一次。

于 2013-07-25T08:07:04.407 回答