从网址加载位图太慢了

时间:2013-07-25 07:59:41

标签: java android bitmap

我从数据库加载大约10个位图,但将来可能还会增加一些。

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

这是我的代码:

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

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

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

有没有办法改善这个?喜欢不是每次都创建一个新的Bitmap-Object?

2 个答案:

答案 0 :(得分:1)

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

我在兼容包中使用LRUCache

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

修改:我现在注意到您的图片来源是网络服务。这甚至更好:构建一个双层缓存:内存缓存和磁盘缓存。

所以获取图片会:

  1. 检查图像是否在内存中:是的,您可以立即使用它。
  2. 检查sdcard / app文件结构中的图像是否存在:是的,您几乎可以立即使用
  3. 从网络下载图片。但即使在这里,如果您可以访问该服务,也可以进行一些改进。在服务器端,使用API​​根据需要调整图像大小。在服务器端缓存那些已调整大小的图像。这样,您将优化下载速度和客户端应用程序内存。或者,如果您无权访问该服务,请构建您自己的代理服务,以便在运行时调整大小并调用该服务。

答案 1 :(得分:0)

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

您可以尝试使用线程一次加载多个图像。创建连接时大部分时间都丢失了,您是否每次都要等待请求。如果使用线程,则可以缩短连接创建并行化的图像加载时间。

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