版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贷款延期补充协议书范本
- 2024居间合同样的合同
- 工程测量设计合同
- 培训机构合作合同样本
- 技术许可与知识产权保护
- 国有企业下岗职工出中心与失业保险“并轨”协议书
- 2024配方转让协议标准文本
- 工程合同签订方法
- 房屋租赁合同提前解除的策略与建议
- 园林绿化承包经营合同样本
- 易制爆化学品(剧毒品)防盗抢、防破坏应急预案
- 高职专业人才培养方案-护理专业人才培养方案
- 医学微生物学课件:支原体与衣原体
- 某幼儿园食品贮存管理制度培训
- 河南省南阳市2022-2023学年高一上学期期末语文试题
- 现代物流管理专业生涯发展展示
- 柱塞泵工作原理动画演示
- 幼儿园开展“一对一倾听”的实践与反思
- 空中乘务生涯发展
- 盐田采盐生产示范
- 科室院感自查报告
评论
0/150
提交评论