欢迎来到天天文库
浏览记录
ID:37770892
大小:26.22 KB
页数:6页
时间:2019-05-30
《图片缓存之内存缓存技术LruCache》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、图片缓存之内存缓存技术LruCache,软引用每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧。这篇博文要讲的图片缓存机制,我接触到的有两钟,一种是软引用,另一种是内存缓存技术。先来看下两者的使用方式,再来作比较。除了加载图片时要用到缓存处理,还有一个比较重要的步骤要做,就是要先压缩图片。1、压缩图片至于要压缩到什么状态就要看自己当时的处境了,压缩图片的时候既要达到一个小的值,又不能让其模糊,更不能拉伸图片。1./**2.
2、 *加载内存卡图片3. */4. BitmapFactory.Optionsoptions = new BitmapFactory.Options();5. options.inJustDecodeBounds = true; //设置了此属性一定要记得将值设置为false6. Bitmapbitmap = null;7. bitmap = BitmapFactory.decodeFile(url, options);8. int be =
3、(int) ((options.outHeight > options.outWidth ? options.outHeight / 1509. : options.outWidth / 200));10. if (be <= 0) //判断200是否超过原始图片高度11. be = 1; //如果超过,则不进行缩放12. options.inSampleSize = be;13. options.inPreferredConfig =
4、Bitmap.Config.ARGB_4444;14. options.inPurgeable = true;15. options.inInputShareable = true;16. options.inJustDecodeBounds = false;17. try {18. bitmap = BitmapFactory.decodeFile(url, options);19. } catch (OutOfMemoryError e
5、) {20. System.gc();21. Log.e(TAG, "OutOfMemoryError");22. }2、软引用:只要有足够的内存,就一直保持对象,直到发现内存吃紧且没有StrongRef时才回收对象。我们可以这样定义:map里面的键是用来放图片地址的,既可以是网络上的图片地址,也可以SDcard上的图片地址,map里面的值里面放的是持有软引用的Bitmap,当然如果你要放Drawable,那也是可以的。1.private Map6、eference> imageMap = new HashMap>();接下来就让我再介绍一下如何具体加载图片:步骤:(1)先通过URL查看缓存中是否有图片,如果有,则直接去缓存中取得。 如果没有,就开线程重新去网上下载。 (2)下载完了之后,就把图片放在缓存里面,方便下次可以直接从缓存中取得。1.public BitmaploadBitmap(final String imageUrl,final ImageCallBack7、imageCallBack) {2. SoftReference reference = imageMap.get(imageUrl);3. if(reference != null) {4. if(reference.get() != null) {5. return reference.get();6. }7. }8. final Handler handler = new Hand8、ler() {9. public void handleMessage(final android.os.Messagemsg) {10. //加入到缓存中11. B
6、eference> imageMap = new HashMap>();接下来就让我再介绍一下如何具体加载图片:步骤:(1)先通过URL查看缓存中是否有图片,如果有,则直接去缓存中取得。 如果没有,就开线程重新去网上下载。 (2)下载完了之后,就把图片放在缓存里面,方便下次可以直接从缓存中取得。1.public BitmaploadBitmap(final String imageUrl,final ImageCallBack
7、imageCallBack) {2. SoftReference reference = imageMap.get(imageUrl);3. if(reference != null) {4. if(reference.get() != null) {5. return reference.get();6. }7. }8. final Handler handler = new Hand
8、ler() {9. public void handleMessage(final android.os.Messagemsg) {10. //加入到缓存中11. B
此文档下载收益归作者所有