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.();
•}
•}
•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如何获取图片或视频略缩图

根据指定的图像路径和大小来获取缩略图 此方法有两点好处: 1.使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图。 2. 缩略图对于原图像来讲没有拉伸,这里使用了2.2版本的新工具ThumbnailUtils,使 用这个工具生成的图像不会被拉伸。 /** * @param imagePath * 图像的路径 * @param width * 指定输出图像的宽度 * @param height * 指定输出图像的高度 * @retur

Android中Bitmap的加载和Cache

作者:PanicLin 简介 由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16MB,导致加载Bitmap时很容会议出现内存溢出。如何高效加载Bitmap是一个很重要也容易被开发者忽视的问题。 Android中缓存策略是一个通用的思想,实际开发中经常需要用到Bitmap做缓存。通过缓存策略我么不需要每次都从网络上请求图片或者从存储设备中加载图片。目前比较常用的缓存策略时LruCache和DiskLruCache,其中LruCache常被用作内存缓存,而DiskLruCache.

weixin_55362248的博客 324

Oracle19c安装,基本配置教程(超详细)

安装有出错的风险,卸载也是比较麻烦的,所以先提前设置一个还原点,在windows中的步骤如下,如果对自己有信心,可以直接跳过该部分开始安装oracle在设置中进入创建还原点的界面开始创建还原点上面已经成功创建了还原点,如果安装oracle时出现问题,自己也无法解决,恢复到安装之前即可,恢复步骤如下经过上面的步骤,Oracle我们就能够正常使用了,我们就使用自己在sql plus里面创建的账号即可,创建的表会默认存放在我们自己创建的表空间里面。

秃头披风侠的博客 7万+

Android使用LruCache来缓存Bitmap

Picasso为追求小而美,有功能取舍,比如,它无法支持下载动态图片。 如果你有这个需求,可以考虑使用Google的Glide或Facebook的Fresco。它们各有特点,Glide比较小巧,Fresco性能好。 上面的库都有缓存机制,如果自己实现的话,可以使用许多缓存机制使用一种叫作LRU(least recently used,最近最少使用)的存储策略。基于该种策略,当存储空间用尽时,缓...

Zcp的博客 946

测试用例经典练习之微信发红包测试用例

微信发红包测试用例

ZCYaiCLX3344的博客 1万+

ArcGIS基础:点要素分割线要素和提取线要素的交点

第一个实验:【点要素分割线要素】看下原始数据:下图所示,2个红点和一条绿线,用2个点去分割这条线。 找到【数据管理工具】,在找到【要素】,再找到【在点处分割线】,如下图所示。 输入线、点要素,然后在【搜索半径】里输入5米,查看一下结果。 查看结果发现,线段被分割了2段,我们查看一下原因。 发现第2个点与线有一段距离,肯定是大于5米的,所以分割没有成功。可以量测一下距离,重新输入搜索半径。 我们把搜索半径改为200米,勘察结果,被点分割了3段。 接下来使用另外一个工具【在折点处分割线】,如下所示。

yuanYW7556的博客 1万+

Android进阶:Bitmap的高效加载和Cache,解析底层原理

Log.i(TAG, “initView: outWidth=”+outWidth+",outHeight="+outHeight); //3、原始宽高信息 和 view的大小 计算并设置采样率 ViewGroup.LayoutParams layoutParams = ivBitamp.getLayoutParams(); int inSampleSize = getInSampleSize(layoutParams.width, layoutParams.height, outWidth, outHei

m0_64604042的博客 710

linux应用程序段错误调试

一、堆、栈 在分析段错误之前,先了解一下什么是堆?什么是栈? 堆:一般由开发者分配释放,如果没有释放,程序结束时,在有的OS中可能会被自动释放,分配方式类似于链表。堆的操作方式为,队列优先,先进先出的原则。 栈:由操作系统自动分配,存放函数的参数值,局部变量。栈的操作方式为,先进后出的原则。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。  PUSH:操作在堆栈的顶部加入一个元素...

农村种地人 1111

Android的图片缓存处理

Android的bitmap Bitmap:称为位图文件,扩展名可以是.bmp或者.dib。 Bitmap图片定义为由像素点组成,每个像素点可以由多种色彩表示 下面是四种色彩格式   ARGB_8888:ARGB分别代表的是透明度,红色,绿色,蓝色,每个值分别 用8bit来记录,也就是一个像素会占用4byte,共32bit. ARGB_4444:ARGB的是每个值分别用4bit来记...

lovelixue的博客 7511

【教程4>第2章>第18节】 GMSK调制系统的FPGA开发与matlab对比验证

GMSK(高斯最小频移键控)是一种连续相位的频移键控(CPFSK)调制方法,它在数字通信中得到了广泛应用,特别是在移动通信系统中。GMSK通过限制频率偏差的累积来减少带外辐射,并通过使用高斯滤波器对。

FPGA/MATLAB学习教程/源码/项目合作开发 998

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

在上一篇中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂载失败,这是因为我们还没有根文件系统,在本章中,我们将制作根文件系统。rootfs制作方式有很多方式,如busyBoxbuildrootYocto等,在该篇章中,我们使用buildroot来制作根文件系统,主要考虑到busyBox制作完还需要手动首改一些启动配置比较繁琐,而Yocto如果电脑配置不是很好,编译时间过长,比较麻烦。

sinat_33909696的博客 2465

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

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

一路俊逸的专栏 689

2025年06月中国电子学会青少年软件编程(图形化)等级考试试卷(三级)答案 + 解析

2025年06月中国电子学会青少年软件编程(图形化)等级考试试卷(三级)答案 + 解析

伶俐角少儿编程 341

Android 使用 LruCache 缓存图片详解

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

xingfuyisheng的专栏 750

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

马彦虎的博客 5007

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

YanRu的专栏 6129

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 用LruCache读取大图片并缓存

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

保定老狼的专栏 5412

android读取大图片并缓存

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

dengchu5001的博客 154

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

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

无名 1187

Android图片缓存机制之LruCache和DiskLruCache

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

DerMing_You的博客 409

android 缓存技术lrucache

Lrucache入门,简单易懂

胡世林的博客 509

android lrucache,Android——使用LruCache缓存图片

为什么要缓存图片:(1)根据具体设备的不同Android系统为每个应用分配了固定内存空间供应用使用;(2)图片是一种很占内存的资源文件,如果界面中加载一张图片还好说,如果要加载大量的图片就会超过系统为应用分配的空间发生OOM异常,使程序奔溃;2.LruCache:主要算法原理:将最近使用的对象用强应用存储到LinkedHashMap中,在缓存值达到最大是把最近最少使用的对象从缓存区中移除;3.实现...

weixin_36136552的博客 425

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

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

Winters_huang'Blog 1348

安卓之缓存的应用场景以及各种技术优劣分析

本文主要探讨了安卓开发中的缓存技术及其应用场景,通过分析几种常见的缓存技术,包括内存缓存、磁盘缓存和网络缓存,阐述了它们的优点和缺点。此外,本文还提供了相应的代码示例,以帮助读者更好地理解这些缓存技术的实现方式。

wlred1980的博客 1838
上一篇: android app 版本升级
下一篇: android 内存溢出问题分析
canvas18
博客等级 码龄15年 8粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值