每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧。 这篇博文要讲的图片缓存机制,我接触到的有两钟,一种是软引用,另一种是内存缓存技术。 先来看下两者的使用方式,再来作比较。 除了加载图片时要用到缓存处理,还有一个比较重要的步骤要做,就是要先压缩图片。
1、压缩图片 至于要压缩到什么状态就要看自己当时的处境了,压缩图片的时候既要达到一个小的值,又不能让其模糊 ,更不能拉伸图片。
/** * 加载内存卡图片 */ BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 设置了此属性一定要记得将值设置为false Bitmap bitmap = null; bitmap = BitmapFactory.decodeFile(url, options); int be = (int) ((options.outHeight > options.outWidth ? options.outHeight / 150 : options.outWidth / 200)); if (be <= 0) // 判断200是否超过原始图片高度 be = 1; // 如果超过,则不进行缩放 options.inSampleSize = be; options.inPreferredConfig = Bitmap.Config.ARGB_4444; options.inPurgeable = true; options.inInputShareable = true; options.inJustDecodeBounds = false; try { bitmap = BitmapFactory.decodeFile(url, options); } catch (OutOfMemoryError e) { System.gc(); Log.e(TAG, “OutOfMemoryError”); }
2、软引用: 只要有足够的内存,就一直保持对象,直到发现内存吃紧且没有Strong Ref时才回收对象。 我们可以这样定义:map里面的键是用来放图片地址的,既可以是网络上的图片地址,也可以SDcard上的图片地址, map里面的值里面放的是持有软引用的Bitmap,当然如果你要放Drawable,那也是可以的。
private Map
