位置: 编程技术 - 正文

Android 图片缓存之内存缓存技术LruCache,软引用(安卓手机图片缓存在哪)

编辑:rootadmin

推荐整理分享Android 图片缓存之内存缓存技术LruCache,软引用(安卓手机图片缓存在哪),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android 缓存文件,安卓手机图片缓存在哪,安卓图片缓存太占空间,android 图片缓存框架,android 图片缓存框架,android图片缓存机制,android 图片缓存框架,android图片缓存机制,内容如对您有帮助,希望把文章链接给更多的朋友!

Android 图片缓存之内存缓存技术LruCache,软引用(安卓手机图片缓存在哪)

转自: * 加载内存卡图片 */ 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 / : options.outWidth / )); if (be <= 0) // 判断是否超过原始图片高度 be = 1; // 如果超过,则不进行缩放 options.inSampleSize = be; options.inPreferredConfig = Bitmap.Config.ARGB_; 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<String, SoftReference<Bitmap>> imageMap = new HashMap<String, SoftReference<Bitmap>>();接下来就让我再介绍一下如何具体加载图片:步骤:(1)先通过URL查看缓存中是否有图片,如果有,则直接去缓存中取得。 如果没有,就开线程重新去网上下载。 (2)下载完了之后,就把图片放在缓存里面,方便下次可以直接从缓存中取得。public Bitmap loadBitmap(final String imageUrl,final ImageCallBack imageCallBack) { SoftReference<Bitmap> reference = imageMap.get(imageUrl); if(reference != null) { if(reference.get() != null) { return reference.get(); } } final Handler handler = new Handler() { public void handleMessage(final android.os.Message msg) { //加入到缓存中 Bitmap bitmap = (Bitmap)msg.obj; imageMap.put(imageUrl, new SoftReference<Bitmap>(bitmap)); if(imageCallBack != null) { imageCallBack.getBitmap(bitmap); } } }; new Thread(){ public void run() { Message message = handler.obtainMessage(); message.obj = downloadBitmap(imageUrl); handler.sendMessage(message); } }.start(); return null ; } // 从网上下载图片 private Bitmap downloadBitmap (String imageUrl) { Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeStream(new URL(imageUrl).openStream()); return bitmap ; } catch (Exception e) { e.printStackTrace(); return null; } } public interface ImageCallBack{ void getBitmap(Bitmap bitmap); }2、内存缓存技术另外一种图片缓存的方式就是内存缓存技术。在Android中,有一个叫做LruCache类专门用来做图片缓存处理的。它有一个特点,当缓存的图片达到了预先设定的&#;的时候,那么近期使用次数最少的图片就会被回收掉。步骤:(1)要先设置缓存图片的内存大小,我这里设置为手机内存的1/8, 手机内存的获取方式:int MAXMEMONRY = (int) (Runtime.getRuntime() .maxMemory() / ); (2)LruCache里面的键&#;对分别是URL和对应的图片 (3)重写了一个叫做sizeOf的方法,返回的是图片数量。private LruCache<String, Bitmap> mMemoryCache;private LruCacheUtils() { if (mMemoryCache == null) mMemoryCache = new LruCache<String, Bitmap>( MAXMEMONRY / 8) { @Override protected int sizeOf(String key, Bitmap bitmap) { // 重写此方法来衡量每张图片的大小,默认返回图片数量。 return bitmap.getRowBytes() * bitmap.getHeight() / ; } @Override protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) { Log.v("tag", "hard cache is full , push to soft cache"); } }; } (4)下面的方法分别是清空缓存、添加图片到缓存、从缓存中取得图片、从缓存中移除。 移除和清除缓存是必须要做的事,因为图片缓存处理不当就会报内存溢出,所以一定要引起注意。public void clearCache() { if (mMemoryCache != null) { if (mMemoryCache.size() > 0) { Log.d("CacheUtils", "mMemoryCache.size() " &#; mMemoryCache.size()); mMemoryCache.evictAll(); Log.d("CacheUtils", "mMemoryCache.size()" &#; mMemoryCache.size()); } mMemoryCache = null; } } public synchronized void addBitmapToMemoryCache(String key, Bitmap bitmap) { if (mMemoryCache.get(key) == null) { if (key != null && bitmap != null) mMemoryCache.put(key, bitmap); } else Log.w(TAG, "the res is aready exits"); } public synchronized Bitmap getBitmapFromMemCache(String key) { Bitmap bm = mMemoryCache.get(key); if (key != null) { return bm; } return null; } /** * 移除缓存 * * @param key */ public synchronized void removeImageCache(String key) { if (key != null) { if (mMemoryCache != null) { Bitmap bm = mMemoryCache.remove(key); if (bm != null) bm.recycle(); } } }4、两者的比较说到这里,我觉得有必要来进行一下比较了。网上有很多人使用软引用加载图片的多 ,但是现在已经不再推荐使用这种方式了,(1)因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象, 这让软引用和弱引用变得不再可靠。(2)另外,Android 3.0 (API Level )中,图片的数据会存储在本地的内存当中, 因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃,所以我这里用得是LruCache来缓存图片,当存储Image的大小大于LruCache设定的&#;,系统自动释放内存,这个类是3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar包。后记:我一直有强调一件事件,就是人应该要不停地进步,没有人生来就会编码,更没有人一开始就能找到很好的解决方案,我介绍了这两种用法,其实就是想说,这些都是我的技术进步的一个历程。如果大家有好的建议或者有什么好的看法,记得提出来,很高兴能和大家分享。

如何在真机上调试Android应用程序(图文详解) 1、首先将手机设置为调试模式方法:设置——应用程序——开发——USB调试,打上√即可2、用数据线连接至电脑,在电脑上安装豌豆荚,此时豌豆荚会

第四章,简单的水果机游戏(Android) 首先说明一点,这个例子有个致命bug,是写到后面才发现的,就是快速连续点start和stop按钮会出错,因为用的handler,所以会不断开启线程,后来也想了

Android圆形图片--自定义控件 Android圆形图片控件效果图如下:代码如下:RoundImageView.java[html]viewplaincopyprint?packagecom.dxd.roundimageview;importandroid.content.Context;importandroid.content.res.TypedArray;imp

标签: 安卓手机图片缓存在哪

本文链接地址:https://www.jiuchutong.com/biancheng/387465.html 转载请保留说明!

上一篇:android:exported 属性详解

下一篇:如何在真机上调试Android应用程序(图文详解)(真机调试什么意思)

  • 流动资金包括哪三种
  • 水费3个点税
  • 电子税务局怎么登录
  • 技术推广服务包含什么 奇瑞汽车
  • 增值税期初应补税额计算
  • 合同租金总收入怎么填
  • 预付材料购货款计入什么科目
  • 当月计提的工资与次月发放数不同
  • 事业单位结转结余科目
  • 国有企业无偿划转资产需要交税吗?
  • 损益类科目计入哪个表
  • 12月份未计提的费用汇算清缴如何调整?
  • 预售房提前还款需要去解押吗
  • 收回委托加工物资的实际成本
  • 没在公司交社保遣散的怎么赔偿
  • 会务费 发票
  • 外出经营活动税收管理证明和跨区域涉税事项报告表
  • 减免能减多久
  • 统一员工行为规范
  • 纳税管理的主要内容是什么
  • 开票系统能导出几年前的
  • 增值税小规模纳税人减免增值税政策
  • 企业委托研发过程中发生的研发费用如何加计扣除?
  • 收取赔偿金开具什么发票
  • win8系统如何设置u盘启动
  • 个人所得税到年底能不能退回来
  • 接受捐赠收入要计入销售收入吗
  • 总公司人员的工资子公司发,如何报税?
  • 销售商品收到商业汇票一张会计分录
  • wordpress的文章在数据库里吗?
  • window php安装
  • 会计凭证设计要注意的问题
  • 股本减少的账务怎么处理
  • php7.1
  • php的图片
  • php官方文档
  • 建筑工程增值税怎么算
  • 会计学中借和贷怎么区分
  • 小规模企业所得税优惠政策最新2022
  • 公司代买社保怎么收费
  • 织梦专题页模板
  • 普通发票和增值税发票的税率
  • 单位全额承担社保能税前扣除吗
  • 现金流量表里支付的各项税费包括什么
  • 企业营业执照的颁发部门是
  • 纳税人防伪税控设备未抄报怎么办
  • 成品油办法废止后,加油站还需办理成品油许可证吗
  • 中小型企业应收账款风险管理
  • 模具维修费用清单表格
  • 投资收益属于什么科目,借贷方向
  • 收到社保局返还的各类社保款项应从哪个表单发起
  • 贷款罚息会计分录
  • 单位食堂收费制度
  • 佣金付给别人公司合法吗
  • 软件开发的知识产权有哪些
  • 开业前的装修费怎么做账
  • 两家公司
  • 哪些发票必须注销
  • 小企业建账流程图
  • 固定资产建账为什么不能直接输入名字
  • mysql replace正则表达式
  • ms sql mysql
  • win7系统突然退化
  • win7还原系统怎么还原
  • win7系统IE浏览器版本
  • centos7权限
  • qqexternal.exe是什么进程如何删除(CPU的使用率在90%)
  • ubuntu怎么刷新桌面
  • SsAAD.exe - SsAAD是什么进程
  • windows7可以打开多个窗口
  • win8如何禁止电脑自动安装软件
  • 全志科技在国内芯片界地位
  • java中遍历数组的方法
  • 有没有改善
  • android开发电视app教程
  • jQuery给div,Span, a ,button, radio 赋值与取值
  • jquery的ajax提交form表单的两种方法小结(推荐)
  • 广东智慧团建登录不上去怎么回事
  • 地税怎么查个人所得税
  • 个人所得税必须企业代扣代缴吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设