Android图片缓存技术

Android ListView图片加载优化:二级缓存技术实现 双缓存机制的优化流程大致可以概括如下:当请求加载数据时,首先查询内存缓存。如果内存缓存中存在所需的数据,则直接使用,无需从磁盘读取。如果内存缓存中不存在,则查询磁盘缓存。如果磁盘缓存中存在所需数据,则将数据从磁盘加载到内存中,以便快速访问。如果磁盘缓存也不存在该数据,则需要从网络或其他数据源进行加载,并同时将新数据存储到磁盘和内存中以备后用。这种优化流程通过减少不必要的磁盘I/O操作,加快了数据访问速度,同时提高了应用的响应性。 阅读详情

          Android开发中使用ListView加载的界面中有许多图片,图片多了界面加载就会很慢,很卡 甚至会 出现内存溢出情况,,我们可以使用Android自带的缓存技术对图片进行优化处理,代码如下:

可以先使用下 ,看看效果下载链接: http://sj.qq.com/myapp/detail.htm?apkName=opt.ls.liveSteward 

          package opt.ls.util;
import opt.ls.liveSteward.R;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v4.util.LruCache;
import android.widget.ImageView;
import android.widget.SimpleAdapter;


/**
 * @Description TODO(图片优化)
 * @author 彭甜
 * @version 1.0.0
 * @Date 2014-6-20 13:45:00
 * 
 */
@SuppressLint("NewApi")
public class OptimizeImage {
private static LruCache<String, Bitmap> mMemoryCache; // 图片缓存技术
private static OptimizeImage optimizeImage;


/**
* @Description TODO(根据传入的宽和高,计算出合适的inSampleSize值)
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}


/**
* @Description TODO(首先你要将BitmapFactory.Options的inJustDecodeBounds属性设置为true,
*              解析一次图片。然后将BitmapFactory.
*              Options连同期望的宽度和高度一起传递到到calculateInSampleSize方法中,
*              就可以得到合适的inSampleSize值了
*              。之后再解析一次图片,使用新获取到的inSampleSize值,并把inJustDecodeBounds
*              设置为false,就可以得到压缩后的图片了)
* @param filePath
* @param reqWidth
* @param reqHeight
* @return
*/
public static Bitmap decodeSampledBitmapFromFile(String filePath,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filePath, options);
}


/**
* @Description TODO(异步加载图片)
* @author 彭甜
* 
*/
class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
private ImageView imageView;
private Bitmap bitmap;
private SimpleAdapter simpleAdapter;
public BitmapWorkerTask(ImageView imageView) {
this.imageView = imageView;
}


/**
* @Description TODO(在后台加载图片)
*/
@Override
protected  Bitmap doInBackground(String... params) {
try {
Thread.sleep(50);

// 读取本地图片进行优化
final Bitmap bitmap = decodeSampledBitmapFromFile(params[0], 100,
100);
this.bitmap=bitmap;
addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} 
return null;
}


@Override
protected void onPostExecute(Bitmap result) {
if(imageView!=null){
imageView.setImageBitmap(bitmap);
if(simpleAdapter!=null){
simpleAdapter.notifyDataSetChanged();
}
}

}




}


/**
* @Description TODO(把最近使用的对象用强引用存储在 LinkedHashMap 中,
*              并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除)
* @param key
* @param bitmap
*/
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (key!=null&&getBitmapFromMemCache(key) == null&&bitmap!=null) {

mMemoryCache.put(key, bitmap);
}
}


/**
* @Description TODO(获取之前存入图片缓存中的图片引用对象)
* @param key
*            ,String 缓存引用对象
* @return
*/
@SuppressLint("NewApi")
public static Bitmap getBitmapFromMemCache(String key) {
return mMemoryCache.get(key);
}


/**
* @Description TODO(初始化图片缓存)
*/
public static void initLruCache() {
// 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常。
// LruCache通过构造函数传入缓存值,以KB为单位。
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// 使用最大可用内存值的1/8作为缓存的大小。
int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// 重写此方法来衡量每张图片的大小,默认返回图片数量。
return bitmap.getByteCount() / 1024;
}
};


}


/**
* @Description TODO(加载图片)
* @param imageKey
*            ,String 图片缓存 Key也是图片文件路径
* @param imageView
*            ,ImageView 需要显示的控件
*/
public void loadBitmap(String imageKey, ImageView imageView) {
final Bitmap bitmap = getBitmapFromMemCache(imageKey);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
// 默认展示图片
imageView.setImageResource(R.drawable.ic_menu_report_image);
BitmapWorkerTask task = new BitmapWorkerTask(imageView);
task.execute(imageKey);
}
}


/**
* @Description TODO(生成一个图片缓存单例)
* @return
*/
public static synchronized OptimizeImage initializeInstance() {
if (optimizeImage == null) {
optimizeImage = new OptimizeImage();
}
return optimizeImage;
}


}


效果图使用情况查看链接: http://sj.qq.com/myapp/detail.htm?apkName=opt.ls.liveSteward



Android大图片缓存技术Demo 使用图片压缩技术和缓存技术加载大量图片,防止出现OOM的问题。 立即下载

相关推荐

各种图片缓存技术代码

图片缓存技术,包括16个demo,根据手势缩放图片、afinal框架实现图片的简单异步缓存加载、andengine中直接加载多张小图片合成一张大图片生成动画精灵、Android 图片缓存、加载器、android端用于异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画、android相册系统(用Matrix实现)、安卓图片旋转放大缩写透明度调整例子、扫描手机中的图片,仿微信显示本地图片效果等等

配置Android Studio的缓存文件路径(释放你的C盘)

Android Studio默认安装完后会在C:\Users\YourName.xxx 缓存一些数据,有限的C盘很容易爆增。 如果你的C盘也像我这样捉襟见肘,或者你是处女座的,那么请看完本文,结果会让你超爽。 土豪请绕道。。。Android Studio默认的缓存目录,主要有三个占空间的文件夹,分别是 .android 这个文件夹是Android SDK生成的AVD(Android Virtua

程序老兵的博客 3万+

告别C盘爆红!手把手教你将WSL2下的Ubuntu 22.04完整迁移到D盘(附清理指南)

本文详细指导如何将WSL2下的Ubuntu 22.04从C盘无损迁移到D盘,包括导出备份、注销原系统、导入新位置等关键步骤,并提供迁移后的优化配置、开发环境衔接及长期维护技巧,帮助用户彻底解决C盘空间不足问题。

weixin_28698059的博客 472

android glide 获取缓存图片

Glide是Google推荐用的图片加载框架,很简单就可以加载出图片了,如下: Glide.with(context).load(ImgUrl).into(ImageView); 也可以加一些常用的功能,如placeHolder图片等等,如下: Glide.with(context).load(ImgUrl) .asBitmap() .error(R.drawable

u012737144的专栏 1万+

48V电动车电池包拆解:硬核入门BMS硬件设计与故障排查

BMS(电池管理系统)是锂电应用的核心安全与性能保障模块,其本质是融合电化学、模拟电路、嵌入式控制与热管理的交叉系统。理解BMS不能止步于SOC算法或通信协议,而需回归硬件本体——从电压采样精度、MOSFET驱动时序、被动均衡散热设计到NTC热耦合布局,每一处物理实现都直接决定系统可靠性。48V平台因兼具安全性(<60V ELV)、复杂度(13–14串)与产业普及性,成为BMS工程实践的理想标本。本文聚焦真实电池包中的PCB级设计缺陷识别、关键参数现场验证(如±5mV采样误差、5mΩ导通内阻)、UART协议

weixin_29191081的博客 232

声音事件检测metric:PSDS

这项工作为多声道声音事件检测(SED)系统的性能评估定义了一个新的框架,它克服了传统的collar-based事件决定、事件F-cores和事件错误率的限制。拟议的框架引入了对事件检测的定义,该定义对标签的主观性更为稳健。它还采用了多声道接收器操作特性(ROC)曲线,以提供比F1分数更全面的系统性能洞察力,并建议将这些曲线简化为单一的多声道声音检测分数(PSDS),这允许系统独立于操作点(OPs)进行比较。所提出的方法还能更好地了解不同声音类别的数据偏差和分类稳定性。

Maestro_T的博客 2728

终极解决AndroidStudio缓存的坑

废话不多说我是你们的力哥,今天在用Android Studio的时候打开之前项目报如下错误: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181101101013769.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLm...

巧克力的专栏 8756

解决西门子Step 7 basic 找不到许可证问题

你在使用博图软件是否遇到过Step 7 basic 找不到许可证的问题呢!不言怕,今天我就来告诉你该如何处理吧!看步骤: 1.删除原授权的License: 打开Automation License Manager应用,然后我们可以发现仅有的License Key前面有一个时钟,说明它已经过期不可用,我们就要去寻求新的Key. 打开“我的电脑”,选择C盘,点击上方查看 点击选项–>查看 然...

让技术没有门槛 14万+

Android 平滑图片加载和缓存库 Glide 使用详解

在图片加载库烂大街的今天,选择一个适合自己使用的图片加载库已经成为了每一个Android开发者的必经之路。 现在市面上知名的图片加载库有UIL,Picasso,Volley ImageLoader,Fresco以及我们今天的主角Glide。它们各有千秋,不能评定谁一定比谁好,只能说哪一个更适合你。 我的理解 下面我来谈一下个人对这些图片加载库的理解,如有错误,还望指教。 Univers

wblobin的博客 890

5分钟搞定三网话费余额查询:手把手教你用PHP+HTML搭建查询系统(含API调用避坑指南)

本文详细介绍了如何使用PHP+HTML快速搭建三网话费余额查询系统,涵盖API调用避坑指南、前端UI设计及性能优化。通过统一处理移动、电信、联通三大运营商接口差异,实现高可用查询功能,并提供安全防护与生产部署建议,帮助开发者高效构建稳定可靠的话费查询工具。

weixin_29016833的博客 259

CSV文件输入到simulink中

将示波器波形和数据CSV文件保存下来进行数据分析。将波形绘制到simulink中

yay0923的博客 5326

图片缓存技术

在Android加载网络图片一章中当滚动屏幕时会不但调用异步任务重新加载图片,这样即浪费网络资源用户体验也不好,那么我们可以将图片缓存起来,要显示时先从缓存获取.图片缓存的实现分为两种一种内存缓存,一种文件缓存. 内存缓存Google已经帮我们实现,通过LruCache你可以非常方便快速的实现内存缓存. 先简单了解下LruCache原理,Lru是最近最少使用的意思,要做内存缓存首先需要定义缓

luoyang2的博客 847

【C++】【STL算法】数据窄化及代码安全性

本文系统探讨了C++工程中数据窄化(narrowing conversion)的隐患与解决方案。数据窄化指将高精度/大范围类型转换为低精度/小范围类型,虽语法合法但会导致静默精度损失。其危险性体现在:错误隐蔽、STL会放大问题、数值错误具有传播性。现代C++要求窄化必须显式声明,文中提出四种工程解决方案:显式转换、边界统一转换、范围检查转换和使用GSL工具。建议在系统边界集中处理窄化,保持计算链路类型一致性,并通过分层策略(建模用double,控制用float)确保数值稳定性。核心思想是让窄化成为清晰可控的

Double Galaxy 80

安卓图片缓存技术

在加载高分辨率图片的时候,最好先将图片进行压缩,一般情况下将图片压缩到大小与展示该图片的控件的大小差不多就可以。比如说:我们常用的腾讯QQ,在展示用户图像的控件上显示的实际上是压缩过的用户上传后的图片,当你要查看自己上传高清图像时,腾讯专门提供了一个查看大图的功能,此时才会将用户上传的图片显示出来,这样做的目的当然是为了减少程序占用的内存。压缩图片主要是用到了安卓BitmapFactory.Options类,主要是通过设置options.inJustDecodeBounds = true;

m0_72429728的博客 234

FPGA 学习笔记:Vitis IDE launch failed 的解决方法

FPGA 学习笔记:Vitis IDE launch failed 的解决方法

坚韧与专注 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android 图片缓存之内存缓存技术LruCache,软引用

1、压缩图片 至于要压缩到什么状态就要看自己当时的处境了,压缩图片的时候既要达到一个小的值,又不能让其模糊 ,更不能拉伸图片。 /**          * 加载内存卡图片          */         BitmapFactory.Options options = new BitmapFactory.Options();        

mingtingjie的专栏 620

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android图片双缓存,Android之---图片缓存技术(抛砖引玉)

Android中图片缓存简单介绍使用背景在你应用程序的UI界面加载一张图片是一件很简单的事情,但是当你需要在界面上加载一大堆图片的时候,情况就变得复杂起来。在很多情况下,(比如使用ListView, GridView 或者 ViewPager 这样的组件),屏幕上显示的图片可以通过滑动屏幕等事件不断地增加,最终导致OOM。为了保证内存的使用始终维持在一个合理的范围,通常会把被移除屏幕的图片进行回收...

weixin_35927318的博客 439

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android 图片缓存之内存缓存技术LruCache 软引用

Android 图片缓存之内存缓存技术LruCache 软引用

qq_43667155的博客 286

Android----图片缓存技术

一些大图片的处理,如果处理不当就会报OOM异常,除了加载图片时要用到缓存处理,还有一个比较重要的步骤要做,就是要先压缩图片。 1、压缩图片:至于要压缩到什么状态就要看自己当时的处境了,压缩图片的时候既要达到一个小的值,又不能让其模糊,更不能拉伸图片。 * 加载内存卡图片 */ BitmapFactory.Options o

SiwenYY的博客 648
上一篇: Android ListView嵌套ListView、滚动刷新数据
下一篇: 笑话
aspnetandjava
博客等级 码龄16年 43粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值