android 用LruCache读取大图片并缓存

KiCad集成ngspice:SPICE模型导入与电路仿真完整指南 在电子设计自动化领域,SPICE仿真一直是验证电路功能与性能的核心手段。对于电源管理、模拟前端及传感器接口等典型应用场景,工程师通常需要依赖厂商提供的SPICE模型进行行为级或宏模型级验证。KiCad作为开源EDA工具链的代表,自6.0版本起深度集成ngspice引擎,实现了原理图绘制与仿真验证的无缝衔接,大幅优化了传统画图与仿真分离的低效流程。本文从SPICE模型的基础原理出发,系统讲解如何在KiCad中完成模型文件获取、子电路语法辨认、符号引脚映射等关键步骤,并结合实际操作演示瞬态分析、交流扫描等核心仿 阅读详情
图片预取缓存策略是内存缓存(硬引用LruCache、软引用SoftReference<Bitmap>)、外部文件缓存(context.getCachedDir()),缓存中取不到的情况下再向服务端请求下载图片。同时缓存三张图片(当前预览的这张,前一张以及后一张)。1.内存缓存

  • //需要导入外部jar文件 android-support-v4.jar  
  •     import android.support.v4.util.LruCache;  
  •     //开辟8M硬缓存空间  
  •     private final int hardCachedSize = 8*1024*1024;      
  •     //hard cache  
  •     private final LruCache<String, Bitmap> sHardBitmapCache = new LruCache<String, Bitmap>(hardCachedSize){  
  •         @Override  
  •         public int sizeOf(String key, Bitmap value){  
  •             return value.getRowBytes() * value.getHeight();  
  •         }  
  •         @Override  
  •         protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue){  
  •             Log.v("tag", "hard cache is full , push to soft cache");  
  •             //硬引用缓存区满,将一个最不经常使用的oldvalue推入到软引用缓存区  
  •             sSoftBitmapCahe.put(key, new SoftReference<Bitmap>(oldValue));  
  •         }  
  •     }  
  •     //软引用  
  •     private static final int SOFT_CACHE_CAPACITY = 40;  
  •     private final static LinkedHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache =   
  •         new  LinkedHashMao<String, SoftReference<Bitmap>>(SOFT_CACHE_CAPACITY, 0.75f, true){  
  •         @Override  
  •         public SoftReference<Bitmap> put(String key, SoftReference<Bitmap> value){  
  •             return super.input(key, value);  
  •         }  
  •         @Override  
  •         protected boolean removeEldestEntry(LinkedHashMap.Entry<Stirng, SoftReference<Bitmap>> eldest){  
  •             if(size() > SOFT_CACHE_CAPACITY){  
  •                 Log.v("tag", "Soft Reference limit , purge one");  
  •                 return true;  
  •             }  
  •             return false;  
  •         }  
  •     }  
  •     //缓存bitmap  
  •     public boolean putBitmap(String key, Bitmap bitmap){  
  •         if(bitmap != null){  
  •             synchronized(sHardBitmapCache){  
  •                 sHardBitmapCache.put(key, bitmap);  
  •             }  
  •             return true;  
  •         }         
  •         return false;  
  •     }  
  •     //从缓存中获取bitmap  
  •     public Bitmap getBitmap(String key){  
  •         synchronized(sHardBitmapCache){  
  •             final Bitmap bitmap = sHardBitmapCache.get(key);  
  •             if(bitmap != null)  
  •                 return bitmap;  
  •         }  
  •         //硬引用缓存区间中读取失败,从软引用缓存区间读取  
  •         synchronized(sSoftBitmapCache){  
  •             SoftReference<Bitmap> bitmapReference = sSoftBtimapCache.get(key);  
  •             if(bitmapReference != null){  
  •                 final Bitmap bitmap2 = bitmapReference.get();  
  •                 if(bitmap2 != null)  
  •                     return bitmap2;  
  •                 else{  
  •                     Log.v("tag", "soft reference 已经被回收");  
  •                     sSoftBitmapCache.remove(key);  
  •                 }  
  •             }  
  •         }  
  •         return null;  
  •     }  


2.外部文件缓存

  • private File mCacheDir = context.getCacheDir();  
  •     private static final int MAX_CACHE_SIZE = 20 * 1024 * 1024; //20M  
  •     private final LruCache<String, Long> sFileCache = new LruCache<String, Long>(MAX_CACHE_SIZE){  
  •         @Override  
  •         public int sizeOf(String key, Long value){  
  •             return value.intValue();  
  •         }  
  •         @Override  
  •         protected void entryRemoved(boolean evicted, String key, Long oldValue, Long newValue){  
  •             File file = getFile(key);  
  •             if(file != null)  
  •                 file.delete();  
  •         }  
  •     }  
  •     private File getFile(String fileName) throws FileNotFoundException {  
  •         File file = new File(mCacheDir, fileName);  
  •         if(!file.exists() || !file.isFile())  
  •             throw new FileNotFoundException("文件不存在或有同名文件夹");  
  •         return file;  
  •     }  
  •     //缓存bitmap到外部存储  
  •     public boolean putBitmap(String key, Bitmap bitmap){  
  •         File file = getFile(key);  
  •         if(file != null){  
  •             Log.v("tag", "文件已经存在");  
  •             return true;  
  •         }  
  •         FileOutputStream fos = getOutputStream(key);  
  •         boolean saved = bitmap.compress(CompressFormat.JPEG, 100, fos);  
  •         fos.flush();  
  •         fos.close();  
  •         if(saved){  
  •             synchronized(sFileCache){  
  •                 sFileCache.put(key, getFile(key).length());  
  •             }  
  •             return true;   
  •         }  
  •         return false;  
  •     }  
  •     //根据key获取OutputStream  
  •     private FileOutputStream getOutputStream(String key){  
  •         if(mCacheDir == null)  
  •             return null;  
  •         FileOutputStream fos = new FileOutputStream(mCacheDir.getAbsolutePath() + File.separator + key);  
  •         return fos;  
  •     }  
  •     //获取bitmap  
  •     private static BitmapFactory.Options sBitmapOptions;  
  •     static {  
  •         sBitmapOptions = new BitmapFactory.Options();  
  •         sBitmapOptions.inPurgeable=true; //bitmap can be purged to disk  
  •     }  
  •     public Bitmap getBitmap(String key){  
  •         File bitmapFile = getFile(key);  
  •         if(bitmapFile != null){  
  •             Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(bitmapFile), null, sBitmapOptions);  
  •             if(bitmap != null){  
  •                 //重新将其缓存至硬引用中  
  •                 ...  
  •             }  
  •         }  
  •     }  


3.从服务端下载图片
下载成功后调用1内存缓存的putBitmap()函数,缓存图片。
在外部文件缓存中也写入一份,调用2的putBitmap()函数.

4.预览图片的流程
1) 如果预览的图片在内存缓存区中,直接调用1的getBitmap()函数,获取bitmap数据(先在硬引用缓存区查找匹配,若硬引用区匹配失败,再去软引用区匹配)
2) 如果从内存缓存区读取失败,再从外部文件缓存中读取,调用2的getBitmap()函数
3) 如果从外部文件缓存中读取失败,则从服务端下载该图片,过程3.

5.生成key值
  • private static String generateKey(String fileId, int width, int height) {         
  •         String ret = fileId + "_" + Integer.toString(width) + "x" + Integer.toString(height);  
  •         return ret;  
  •     }  
  •     String key = generateKey(...)即可生成唯一的key值  
Android高效批量下载图片并实现流畅缓存实战 在移动应用开发中,图片作为最常见且资源消耗较大的媒体类型之一,其加载效率和内存管理直接影响用户体验。尤其在涉及批量下载图片的场景下,若缺乏有效的缓存策略,极易引发内存溢出(OOM)、卡顿甚至应用崩溃等问题。因此,构建一个高效、稳定、可扩展的图片加载与缓存体系成为Android开发中的核心技术挑战。Android原生是一个泛型抽象类,开发者需继承并重写sizeOf()方法才能实现基于对象大小而非数量的容量控制。 阅读详情

相关推荐

Android使用LruCache缓存图片

Android使用LruCache缓存图片,

LruCache缓存处理及异步加载图片类的封装

Android中的缓存处理及异步加载图片类的封装 一、缓存介绍: (一)、Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一。 1、没有缓存的弊端: 流量开销:对于客户端——服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量。 加载速度:如果应用中图片加...

weixin_34357436的博客 188

C# 原生数字孪生的尝试

本文介绍了使用C#实现数字孪生的基本思路。首先从爱普生官网下载机器人3D模型,然后通过Blender创建并导出带动画的FBX模型。在WPF项目中,使用HelixToolkit.SharpDX等插件加载模型,通过Viewport3DX进行3D渲染。关键点是通过动画控制器接收真实设备信号来驱动模型动画,实现物理实体与虚拟模型的同步。文中提供了完整的代码实现,包括模型导入、动画播放控制等核心功能。该方法为构建数字孪生系统提供了一种可行的技术方案。

qq_33529095的博客 1333

Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片

一、问题描述 使用LruCache、AsyncTask实现批量图片的加载并达到下列技术要求 1、从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2、及时移除无效的异步线程;保证异步加载图片时不会乱序 3、只对当前屏幕可见部分进行缓存、异步加载图片 4、优化性能杜绝OOM 二、案例介绍  案例实...

weixin_34238642的博客 114

2.ROS实用工具:坐标变换

本文围绕ROS坐标变换展开,介绍其在机器人系统中的关键作用,即统一不同传感器和执行器坐标系,服务数据融合等操作。基于ROS的tf库,从广播和监听TF变换两方面阐述实现过程,涵盖新建工作包、编写广播和监听代码、配置构建文件及编译等步骤。此外,介绍启动节点管理器后运行广播和监听节点的方法,并通过rqt_graph、rqt_tf_tree、tf_echo等工具可视化和获取坐标系变换信息。借助这些内容,读者不仅能掌握ROS坐标变换的实现,还能对机器人坐标变换系统的调试和理解有更深入认识 。

qq_74168740的博客 1173

VSCode+Pyside6开发环境配置全攻略:从安装到实战UI设计

本文提供了一份详细的VSCode与Pyside6集成开发环境配置指南。从创建Python虚拟环境、安装必备VSCode插件,到深度配置PYQT Integration插件以打通Qt Designer与代码编译,最后通过一个待办事项应用实战演示了从UI设计到业务逻辑绑定的完整工作流,旨在帮助开发者建立高效、可维护的GUI开发环境。

qq_27496129的博客 982

图片内存篇之 -- LruCache缓存机制

LRU是近期最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象。采用LRU算法的缓存有两种:LruCache和DisLruCache,分别用于实现内存缓存和硬盘缓存,其核心思想都是LRU缓存算法。 LruCache是个泛型类,主要算法原理是把最近使用的对象用强引用(即我们平常使用的对象引用方式)存储在 LinkedHashMap 中。当缓存满时,把最近最少使用的...

阿依土鳖王子の博客 428

离线路径规划服务Graphhopper

离线路径规划服务Graphhopper 本文主要探索使用Graphhopper搭建离线路径规划服务,需要掌握一定的JAVA基础环境配置的知识 文章目录离线路径规划服务Graphhopper前言一、Graphhopper是什么?二、使用步骤1.下载Graphhopper2.从OpenStreetMap下载路图数据3.安装Graphhopper所需环境4.修改配置5.启动Graphhopper总结 前言 在外网环境中可以使用百度、高德等第三方的sdk用以实现路径规划的功能,由于项目的需要,在离线环境中需要使

Sysdark的博客 7560

Android优化:Android 用LruCache读取大图片并缓存

前言:内存优化很重要。 图片预取缓存策略是内存缓存(硬引用LruCache、软引用SoftReference)、外部文件缓存(context.getCachedDir()),缓存中取不到的情况下再向服务端请求下载图片。同时缓存三张图片(当前预览的这张,前一张以及后一张)。 1.内存缓存 //需要导入外部jar文件 android-support-v4.jar       impo

Winters_huang'Blog 1348

如何借助Gemini 3 Pro完成一篇文献精读?(劝收藏)

金句必须是原文的完整句子,并附上该句子在文中的大致位置。你是一名资深科研文献评估专家,请根据我提供的文献信息(标题、作者、期刊、时间、引用、摘要、结论、图表)依次输出:①影响力评估:按期刊、作者、时间、引用、问题重要性给出1–10分及简述;用上述方法再结合Gemini 3 Pro的辅助,原本需要3小时才能读完一篇文献,现在只需50分钟,不管是顶刊论文还是领域内冷门论文,都可以用这套方法,另外七哥设计的高阶精读提示词,需根据自己的文献内容做调整,希望这篇文章的方法能帮你高效精读文献,掌握文献的精华内容。

智能AI让学术科研更容易 1302

热力学仿真软件:Fluent_(13).燃烧与化学反应仿真

燃烧模型在热力学仿真软件中扮演着至关重要的角色。Fluent 提供了多种燃烧模型,包括层流预混燃烧模型、湍流预混燃烧模型、非预混燃烧模型、部分预混燃烧模型等。这些模型可以帮助用户模拟不同的燃烧过程,从而更好地理解燃烧现象和优化燃烧系统设计。

kkchenjj的博客 1253

android 用LruCache读取大图片并缓存(转)

图片预取缓存策略是内存缓存(硬引用LruCache、软引用SoftReference)、外部文件缓存(context.getCachedDir()),缓存中取不到的景象下再向办事端恳求下载图片。同时缓存三张图片(当前预览的这张,前一张以及后一张)。 1.内存缓存   •//须要导入外部jar文件 android-support-v4.jar •import an

Android开发者 Stay hungry,stay foolish! 488

树莓派 RP2350B 开发环境搭建

本文介绍了树莓派RP2350B开发环境的搭建过程。

张一西的博客 287

[图像处理/特效] android 用LruCache读取大图片并缓存 [

图片预取缓存策略是内存缓存(硬引用LruCache、软引用SoftReference)、外部文件缓存(context.getCachedDir()),缓存中取不到的情况下再向服务端请求下载图片。同时缓存三张图片(当前预览的这张,前一张以及后一张)。1.内存缓存 //需要导入外部jar文件 android-support-v4.jar       import android.sup

我以我名,行我道! 866

[STC32G144K246入门第六步]DAC驱动

本文摘要介绍了STC32G144微控制器内置的12位DAC模块特性与应用。该芯片集成双通道独立DAC,需通过内部运放缓冲后从P0.7/P5.0引脚输出,支持音频处理、波形生成等应用场景。重点阐述了DAC的R-2R梯形网络工作原理、关键性能指标(12位分辨率、转换速度等)及编程配置方法,包括频率设置、寄存器操作和运放引脚配置。文中还提供了32点正弦波表示例和初始化代码,强调参考电压稳定性对输出精度的重要影响。

sinat_58149788的博客 141

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

转《[图像处理/特效] android 用LruCache读取大图片并缓存》

图片预取缓存策略是内存缓存(硬引用LruCache、软引用SoftReference)、外部文件缓存(context.getCachedDir()),缓存中取不到的情况下再向服务端请求下载图片。同时缓存三张图片(当前预览的这张,前一张以及后一张)。1.内存缓存 //需要导入外部jar文件 android-support-v4.jar       import android.sup

一路俊逸的专栏 689

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android 使用 LruCache 缓存图片详解

本文详细介绍了Android中使用LruCache实现图片内存缓存的方法。针对列表等场景下大量图片加载导致的内存问题,提出通过LruCache建立最近最少使用算法缓存,并给出具体实现代码,包括缓存大小计算、图片存取等。同时补充了DiskLruCache磁盘缓存方案,建议采用内存+磁盘的二级缓存策略,优先内存读取,其次磁盘获取,最后网络下载。这种方案能提升加载速度、减少流量消耗,并支持离线访问。文中还对比了新旧缓存技术的差异,强调了合理设置缓存大小的重要性,为Android图片加载优化提供了完整解决方案。

xingfuyisheng的专栏 750

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android三级缓存原理及用LruCache、DiskLruCache实现一个三级缓存的ImageLoader

Android图片三级缓存原理及用LruCache、DiskLruCache动手打造一个三级缓存的ImageLoader三级缓存概述三级缓存的流程强引用 、弱引用 、软引用、虚引用的区别:内存缓存LruCacheDiskLruCache: 三级缓存概述 缓存是一种通用的思想可以用在很多场景中,但在实际的开发中经常用于Bitmap的缓存,用于提高图片的加载效率、提升产品的用户体验和节省用户流量。目...

马彦虎的博客 5007

安卓图片三级缓存策略与实现

前言: 这里说的三级缓存,分别指的是:内存缓存、文件缓存和网络这三个层面。 一般来说,我们首次加载图片,内存和文件是没有缓存的,这样我们需要从网络加载,加载完成后,我们会存到内存和文件中去;当再次加载图片的时候,我们会先查找内存有没有,如果有就直接显示内存中的图片,如果没有,我们会接着查找文件中是否有,如果文件中有,我们会显示文件中的图片,并且把它存到内存中去,这样下次我们在内存中就能找到它了

YanRu的专栏 6129

android读取大图片并缓存

最近开发电视版的云存储应用,要求”我的相册“模块有全屏预览图片的功能,全屏分辨率是1920*1080超清。 UI组件方面采用Gallery+ImageSwitcher组合,这里略过,详情参见google Android API。 相册图片预取缓存策略是内存缓存(硬引用LruCache、软引用SoftReference<Bitmap>)、外部文件缓存(context.g...

dengchu5001的博客 154

Android图片缓存机制之LruCache和DiskLruCache

背景 当用户使用RecyclerView或者ListView的时候,频繁的发起网络请求不仅会消耗大量的流量,还会消耗大量的时间,毫无疑问,这样的用户体验相当糟糕。虽然Glide等图片加载框架已经替我们处理好了图片缓存的问题,但是我们仍然有必要去了解和学习图片缓存机制,才能更好帮助用户省时省流量,提升用户体验。 Android图片的三级缓存机制 内存缓存,读取速度最快。 硬盘缓存(文件缓存),读取...

DerMing_You的博客 409
上一篇: ANDROID JNI之JAVA域与c域的互操作
下一篇: ubuntu rar乱码
保定老狼
博客等级 码龄15年 43粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值