我从数据库加载大约10个位图,但将来可能还会增加一些。
这总共花了大约3秒,我想改进,因为用户需要等到加载完成。 (加载发生在AsyncTask
)
这是我的代码:
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
这是在我从数据库加载JSONArray的循环中,包括此图像(url是图像的有效直接链接)。
我记录了加载所有内容所需的毫秒数,一次迭代约350毫秒,但大约300毫秒只是转换。
有没有办法改善这个?喜欢不是每次都创建一个新的Bitmap-Object?
答案 0 :(得分:1)
为什么不添加缓存功能?加载图像时,您将首先尝试从缓存加载图像。如果图像在那里,你应该立即拥有它。
我在兼容包中使用LRUCache
。
除此之外,从数据库加载图像总是耗费时间和资源。您必须先查找,获取数据然后执行解码。根据持久化的数据类型和图像的大小,这些延迟是正常的。出于这个原因,为什么不将图像保存在SD卡上或应用程序文件结构中的任何位置?我正在使用DiskLRUCache
。
修改:我现在注意到您的图片来源是网络服务。这甚至更好:构建一个双层缓存:内存缓存和磁盘缓存。
所以获取图片会:
答案 1 :(得分:0)
您的问题是每个连接都是自己处理的,这意味着每个图像都会创建一个新的TCP连接来获取数据,然后再次关闭连接。
您可以尝试使用线程一次加载多个图像。创建连接时大部分时间都丢失了,您是否每次都要等待请求。如果使用线程,则可以缩短连接创建并行化的图像加载时间。
另一种选择是使用专用的HTTP客户端库。这可以更好地处理连接,因为它们只打开TCP连接一次,然后通过此单个连接发送多个请求。 TCP连接的开销只有一次。