版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android图片三级缓存策略
1.简介Android缓存原理都是一样,可以自己封装。三级缓存:1.内存缓存:缓存在内存中,基于LRU(leastrecentlyused)算法,机器重启消失。
2.本地缓存。缓存在本地中。一般键值对形式。(url,filepath)
3.网络缓存。从网络加载资源,然后缓存在内存、本地中。2.实现步骤2.1内存缓存:[java]viewplaincopypublicclassMemoryCacheUtils{privateLruCache<String,Bitmap>mMemoryCache;publicMemoryCacheUtils(){longmaxMemory=Runtime.getRuntime().maxMemory()/8;//得到手机最大允许内存的1/8,即超过指定内存,则开始回收//需要传入允许的内存最大值,虚拟机默认内存16M,真机不一定相同mMemoryCache=newLruCache<String,Bitmap>((int)maxMemory){//用于计算每个条目的大小@OverrideprotectedintsizeOf(Stringkey,Bitmapvalue){intbyteCount=value.getByteCount();returnbyteCount;}};}/**@paramurl/publicBitmapgetBitmapFromMemory(Stringurl){//Bitmapbitmap=mMemoryCache.get(url);//1.强引用方法/2.弱引用方法SoftReference<Bitmap>bitmapSoftReference=mMemoryCache.get(url);if(bitmapSoftReference!=null){Bitmapbitmap=bitmapSoftReference.get();returnbitmap;}*/if(url==null||"".equals(url)){returnnull;}Bitmapbitmap=mMemoryCache.get(url);}/**[java]viewplaincopypublicclassLocalCacheUtils{privatestaticfinalStringCACHE_PATH=Environment.getExternalStorageDirectory().getAbsolutePath()+"/my/images";/**@paramurl*/publicBitmapgetBitmapFromLocal(Stringurl){StringfileName=null;//把图片的url当做文件名,并进行MD5加密try{fileName=MD5Encoder.encode(url);//这里加不加密无所谓Filefile=newFile(CACHE_PATH,fileName);Bitmapbitmap=BitmapFactory.decodeStream(newFileInputStream(file));returnbitmap;}catch(Exceptione){e.printStackTrace();}returnnull;}/**@parambitmap*/publicvoidsetBitmapToLocal(Stringurl,Bitmapbitmap){try{}}2.3网络缓存[java]viewplaincopypublicclassNetCacheUtils{privateLocalCacheUtilsmLocalCacheUtils;privateMemoryCacheUtilsmMemoryCacheUtils;publicNetCacheUtils(LocalCacheUtilslocalCacheUtils,MemoryCacheUtilsmemoryCacheUtils){
mLocalCacheUtils=localCacheUtils;
mMemoryCacheUtils=memoryCacheUtils;
}
publicNetCacheUtils(){
}
/**
*从网络下载图片
*@paramivPic显示图片的imageview
*@paramurl下载图片的网络地址
*/
publicvoidgetBitmapFromNet(ImageViewivPic,Stringurl){
newBitmapTask().execute(ivPic,url);//启动AsyncTask
}
publicvoidgetBitmapFromNet(ViewivPic,Stringurl){
newBitmapTask_view().execute(ivPic,url);//启动AsyncTask
}
publicBitmapgetBitmapFromNet(finalStringurl){
//启动AsyncTask
returnnull;
}
/**
*AsyncTask就是对handler和线程池的封装
*第一个泛型:参数类型
*第二个泛型:更新进度的泛型
*第三个泛型:onPostExecute的返回结果
*/
classBitmapTaskextendsAsyncTask<Object,Void,Bitmap>{
privateImageViewivPic;
privateStringurl;
/**
*后台耗时操作,存在于子线程中
*@paramparams
*@return
*/
@Override
protectedBitmapdoInBackground(Object[]params){
ivPic=(ImageView)params[0];
url=(String)params[1];
returndownLoadBitmap(url);
}
/**
*更新进度,在主线程中
*@paramvalues
*/
@Override
protectedvoidonProgressUpdate(Void[]values){
super.onProgressUpdate(values);
}
/**
*耗时方法结束后执行该方法,主线程中
*@paramresult
*/
@Override
protectedvoidonPostExecute(Bitmapresult){
if(result!=null){
ivPic.setImageBitmap(result);
System.out.println("从网络缓存图片啦");
//从网络获取图片后,保存至本地缓存
mLocalCacheUtils.setBitmapToLocal(url,result);
//保存至内存中
mMemoryCacheUtils.setBitmapToMemory(url,result);
}
}
}
/**
*AsyncTask就是对handler和线程池的封装
*第一个泛型:参数类型
*第二个泛型:更新进度的泛型
*第三个泛型:onPostExecute的返回结果
*/
@SuppressLint("NewApi")
classBitmapTask_viewextendsAsyncTask<Object,Void,Bitmap>{
privateViewivPic;
privateStringurl;
/**
*后台耗时操作,存在于子线程中
*@paramparams
*@return
*/
@Override
protectedBitmapdoInBackground(Object[]params){
ivPic=(View)params[0];
url=(String)params[1];
returndownLoadBitmap(url);
}
/**
*更新进度,在主线程中
*@paramvalues
*/
@Override
protectedvoidonProgressUpdate(Void[]values){
super.onProgressUpdate(values);
}
/**
*耗时方法结束后执行该方法,主线程中
*@paramresult
*/
@Override
protectedvoidonPostExecute(Bitmapresult){
if(result!=null){
//ivPic.setImageBitmap(result);
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN){
//Android系统大于等于API16,使用setBackground
ivPic.setBackground(newBitmapDrawable(result));
}else{
//Android系统小于API16,使用setBackground
ivPic.setBackgroundDrawable(newBitmapDrawable(result));
}
System.out.println("从网络缓存图片啦");
//从网络获取图片后,保存至本地缓存
mLocalCacheUtils.setBitmapToLocal(url,result);
//保存至内存中
mMemoryCacheUtils.setBitmapToMemory(url,result);
}
}
}
/**
*网络下载图片
*@paramurl
*@return
*/
publicBitmapdownLoadBitmap(Stringurl){
HttpURLConnectionconn=null;
try{
conn=(HttpURLConnection)newURL(url).openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
intresponseCode=conn.getResponseCode();
if(responseCode==200){
//图片压缩
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inSampleSize=2;//宽高压缩为原来的1/2
options.inPreferredConfig=Bitmap.Config.ARGB_4444;
//Bitmapbitmap=BitmapFactory.decodeStream(conn.getInputStream(),null,options);
Bitmapbitmap=BitmapFactory.decodeStream(conn.getInputStream());
returnbitmap;
}
}catch(IOExceptione){
e.printStackTrace();
}catch(Exceptione){
}finally{
if(conn!=null){
conn.disconnect();
}
}
returnnull;
}}2.4外部写一个bitmapUtils来调用它们。[java]viewplaincopypublicclassMyBitmapUtils{privateNetCacheUtilsmNetCacheUtils;privateLocalCacheUtilsmLocalCacheUtils;privateMemoryCacheUtilsmMemoryCacheUtils;publicMyBitmapUtils(){
mMemoryCacheUtils=newMemoryCacheUtils();
mLocalCacheUtils=newLocalCacheUtils();
mNetCacheUtils=newNetCacheUtils(mLocalCacheUtils,mMemoryCacheUtils);
}
publicBitmapgetBitmap(Stringurl){
Bitmapbitmap=null;
bitmap=mMemoryCacheUtils.getBitmapFromMemory(url);
if(bitmap!=null){
returnbitmap;
}
bitmap=mLocalCacheUtils.getBitmapFromLocal(url);
if(bitmap!=null){
mMemoryCacheUtils.setBitmapToMemory(url,bitmap);
returnbitmap;
}
returnbitmap;
}
publicvoiddisPlay(ImageViewivPic,Stringurl){
Bitmapbitmap;
//内存缓存
bitmap=mMemoryCacheUtils.getBitmapFromMemory(url);
if(bitmap!=null){
ivPic.setImageBitmap(bitmap);
Log.d("iamgecache","从内存获取图片啦>"+url);
return;
}
//本地缓存
bitmap=mLocalCacheUtils.getBitmapFromLocal(url);
if(bitmap!=null){
ivPic.setImageBitmap(bitmap);
Log.d("iamgecache","从本地获取图片啦-->"+url);
//从本地获取图片后,保存至内存中
mMemoryCacheUtils.setBitmapToMemory(url,bitmap);
return;
}
//网络缓存
mNetCacheUtils.getBitmapFromNet(ivPic,url);
Log.d("iamgecache","从网络获取图片啦-->"+url);
}
@SuppressLint("NewApi")
publicvoiddisPlay(ViewivPic,Stringurl){
Bitmapbitmap;
//内存缓存
bitmap=mMemoryCacheUtils.getBitmapFromMemory(url);
if(bitmap!=null){
//ivPic.setImageBitmap(bitmap);
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN){
//Android系统大于等于API16,使用setBackground
ivPic.setBackground(newBitmapDrawable(bitmap));
}else{
//Android系统小于API16,使用setBackground
ivPic.setBackgroundDrawable(newBitmapDrawable(bitmap));
}
//ivPic.setBackground(newBitmapDrawable(bitmap));
Log.d("iamgecache","从内存获取图片啦>"+url);
return;
}
/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国社会科学院考古研究所石窟寺考古研究室考古技师招聘备考题库完整参考答案详解
- 2024年唐山市事业单位招聘考试真题
- 2025年大理州强制隔离戒毒所公开招聘辅警5人备考题库及完整答案详解一套
- 青岛海明城市发展有限公司及全资子公司招聘考试真题2024
- 2025 九年级语文下册戏剧舞台设计意图课件
- 2025年广西百色市乐业县专业森林消防救援队伍招聘13人笔试重点题库及答案解析
- 河口县公安局公开招聘辅警(16人)备考考试试题及答案解析
- 2025-2026 学年高一 语文 期末冲刺卷 试卷及答案
- 国家知识产权局专利局专利审查协作北京中心福建分中心2026年度专利审查员公开招聘备考题库带答案详解
- 2025年互联网保险产品五年政策影响分析报告
- 麻醉科教学查房课件
- 工作秘密管理课件
- 一级建造师-水利工程实务电子教材
- 急救物品护理质量管理
- 2025-2030年中国地奥司明行业市场现状供需分析及投资评估规划分析研究报告
- 前列腺炎病人的护理
- 国家开放大学《理工英语4》期末机考题库
- 学校午休设备管理制度
- T/ZGZS 0302-2023再生工业盐氯化钠
- 联合创立品牌协议书
- 2025人教版(PEP)三年级英语上册期末专项复习:补全对话专项(附答案)
评论
0/150
提交评论