1、图片来源:网络资源、本地资源(sdcard)、资源文件;三者的读取速度依次是:资源文件》本地资源》网络资源
所以,对于经常要用到的图片,可以存放在资源文件中;
2、对于网络资源的图片下载的思考:
1)对于不会变动的图片可以一次下载下来存到手机中(谨慎选择存储到SD卡中,因为可能会检测不到SD卡而使程序无法使用);
2)对于偶尔变动的图片可以在服务器中保存一个version,每次检测version是否变动再决定是否下载(此方法同样适用于App的检测更新);
3)对于经常变动的图片,like 一些列表信息;则适合一张一张的下载;此处可以优化的地方:
a、下载的时候使用线程池(不用每次都new Thread);当不再需要线程池的时候要调用其shutdown方法;
b、使用缓存;有两种:硬盘缓存 (手机存储)、内存缓存(LruCache);注意:在2.3以后,垃圾回收器更倾向于回首软引用和弱引用的对象,这使得软引用和弱引用的对象不再可靠;使用LruCache可以保证对象在使用过程中不被垃圾回收器回收,而且可以自定义其最大使用内存,所以内存缓存推荐使用LruCache;推荐一篇文章,详细介绍了LruCache的用法:http://blog.csdn.net/guolin_blog/article/details/9316683
c、当在滑动状态时不更新;只有在idle state 才进行更新;
3、对于图片加载出现OOM错误的问题?避免出现OOM的几种方法:
1、对不再使用的Bitmap进行回收:bitmap.recycle();注意:要确保bitmap不再使用再进行回收,否则会报错 java.lang.RuntimeException: trying to use a recycled bitmap
2、降低分辨率:这样图片会变小但是会不清晰,看实际需求,比如如果是想形成缩略图则可以使用此方法;尽量确保图片大小跟你需要的大小差不多;
3、可以捕获OutOfMemoryError ,这样就不会出现force close,改善用户体验;具体代码如下:
Bitmap bitmap = null;
try {
// 实例化Bitmap
bitmap = BitmapFactory.decodeFile(path);
} catch (OutOfMemoryError e) {
//
}
if (bitmap == null) {
// 如果实例化失败 返回默认的Bitmap对象
return defaultBitmapMap;
}