【移动应用开发技术】Android图片三级缓存策略_第1页
【移动应用开发技术】Android图片三级缓存策略_第2页
【移动应用开发技术】Android图片三级缓存策略_第3页
【移动应用开发技术】Android图片三级缓存策略_第4页
【移动应用开发技术】Android图片三级缓存策略_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论