Android图片下载本地内存的缓存方式
在内存中保存的话,只能保存一定的量,而不能一直往里面放,需要设置数据的过期时间、LRU等算法。这里有一个方法是把常用的数据放到一个缓存中(A),不常用的放到另外一个缓存中(B)。当要获取数据时先从A中去获取,如果A中不存在那么再去B中获取。B中的数据主要是A中LRU出来的数据,这里的内存回收主要针对B内存,从而保持A中的数据可以有效的被命中。
先定义A缓存:
java代码:
privatefinalHashMap<String,Bitmap>mHardBitmapCache=newLinkedHashMap<String,Bitmap>(HARD_CACHE_CAPACITY/2,0.75f,true){
@Override
protectedbooleanremoveEldestEntry(LinkedHashMap.Entry<String,Bitmap>eldest){
if(size()>HARD_CACHE_CAPACITY){
//当map的size大于30时,把最近不常用的key放到mSoftBitmapCache中,从而保证mHardBitmapCache的效率
mSoftBitmapCache.put(eldest.getKey(),newSoftReference<Bitmap>(eldest.getValue()));
returntrue;
}else
returnfalse;
}
};
再定义B缓存:
java代码:
/**
*当mHardBitmapCache的key大于30的时候,会根据LRU算法把最近没有被使用的key放入到这个缓存中。
*Bitmap使用了SoftReference,当内存空间不足时,此cache中的bitmap会被垃圾回收掉
*/
privatefinalstaticConcurrentHashMap<String,SoftReference<Bitmap>>mSoftBitmapCache=newConcurrentHashMap
从缓存中获取数据:
java代码:
/**
*从缓存中获取图片
*/
privateBitmapgetBitmapFromCache(Stringurl){
//先从mHardBitmapCache缓存中获取
synchronized(mHardBitmapCache){
finalBitmapbitmap=mHardBitmapCache.get(url);
if(bitmap!=null){
//如果找到的话,把元素移到linkedhashmap的最前面,从而保证在LRU算法中是最后被删除
mHardBitmapCache.remove(url);
mHardBitmapCache.put(url,bitmap);
returnbitmap;
}
}
//如果mHardBitmapCache中找不到,到mSoftBitmapCache中找
SoftReference<Bitmap>bitmapReference=mSoftBitmapCache.get(url);
if(bitmapReference!=null){
finalBitmapbitmap=bitmapReference.get();
if(bitmap!=null){
returnbitmap;
}else{
mSoftBitmapCache.remove(url);
}
}
returnnull;
}
如果缓存中不存在,那么就只能去服务器端去下载:
java代码:
/**
*异步下载图片
*/
classImageDownloaderTaskextendsAsyncTask<String,Void,Bitmap>{
privatestaticfinalintIO_BUFFER_SIZE=4*1024;
privateStringurl;
privatefinalWeakReference<ImageView>imageViewReference;
publicImageDownloaderTask(ImageViewimageView){
imageViewReference=newWeakReference<ImageView>(imageView);
}
@Override
protectedBitmapdoInBackground(String...params){
finalAndroidHttpClientclient=AndroidHttpClient.newInstance("Android");
url=params[0];
finalHttpGetgetRequest=newHttpGet(url);
try{
HttpResponseresponse=client.execute(getRequest);
finalintstatusCode=response.getStatusLine().getStatusCode();
if(statusCode!=HttpStatus.SC_OK){
Log.w(TAG,"从"+url+"中下载图片时出错!,错误码:"+statusCode);
returnnull;
}
finalHttpEntityentity=response.getEntity();
if(entity!=null){
InputStreaminputStream=null;
OutputStreamoutputStream=null;
try{
inputStream=entity.getContent();
finalByteArrayOutputStreamdataStream=newByteArrayOutputStream();
outputStream=newBufferedOutputStream(dataStream,IO_BUFFER_SIZE);
copy(inputStream,outputStream);
outputStream.flush();
finalbyte[]data=dataStream.toByteArray();
finalBitmapbitmap=BitmapFactory.decodeByteArray(data,0,data.length);
returnbitmap;
}finally{
if(inputStream!=null){
inputStream.close();
}
if(outputStream!=null){
outputStream.close();
}
entity.consumeContent();
}
}
}catch(IOExceptione){
getRequest.abort();
Log.w(TAG,"I/Oerrorwhileretrievingbitmapfrom"+url,e);
}catch(IllegalStateExceptione){
getRequest.abort();
Log.w(TAG,"IncorrectURL:"+url);
}catch(Exceptione){
getRequest.abort();
Log.w(TAG,"Errorwhileretrievingbitmapfrom"+url,e);
}finally{
if(client!=null){
client.close();
}
}
returnnull;
}
主要信息来源 移动开发者联盟
分享到:
相关推荐
Android之本地缓存——LruCache(内存缓存)与DiskLruCache(硬盘缓存)统一框架 [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间删除,谢谢您。]
android图片异步加载+本地缓存+内存缓存通用jar包(含源码和文档)
Android应用源码之下载网络图片 (整合多线程、内存缓存、本地文件缓存~).rar
下载网络图片 (整合多线程、内存缓存、本地文件缓存~)
Android应用源码之下载网络图片 (整合多线程、内存缓存、本地文件缓存~).zip项目安卓应用源码下载Android应用源码之下载网络图片 (整合多线程、内存缓存、本地文件缓存~).zip项目安卓应用源码下载 1.适合学生毕业...
安卓Android源码——下载网络图片(整合多线程、内存缓存、本地文件缓存~).zip
安卓Android源码——下载网络图片 (整合多线程、内存缓存、本地文件缓存~).rar
安卓Android源码——下载网络图片 (整合多线程、内存缓存、本地文件缓存~) .zip
Android应用源码之下载网络图片 (整合多线程、内存缓存、本地文件缓存~).zip
Android高级应用源码-下载网络图片 (整合多线程、内存缓存、本地文件缓存~).zip
Android中实现帐号密码登录和进行内存缓存逻辑(仿QQ),详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/69219113
android端用于异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画。.zip Android高级图片滚动控件,3D版的图片轮播器Demo.rar GiF完美运行!!!!.rar ViewFlowTest 完美实现gallry轮训效果!...
通常情况下,Android应用程序中图片的缓存策略采用“内存-本地-网络”三级缓存策略,首先应用程序访问网络拉取图片,分别将加载的图片保存在本地SD卡中和内存中,当程序再一次需要加载图片的时候,先判断内存中是否...
下载网络图片 (整合多线程、内存缓存、本地文件缓存~).zip项目安卓应用源码下载下载网络图片 (整合多线程、内存缓存、本地文件缓存~).zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考...
下载网络图片 (整合多线程、内存缓存、本地文件缓存~).zip安卓程序源码资源下载下载网络图片 (整合多线程、内存缓存、本地文件缓存~).zip安卓程序源码资源下载 1.适合学生做毕业设计用 2.适合程序员学习研究用 3....
Android应用源码开发Demo,主要用于毕业设计学习。
安卓Andriod源码——下载网络图片(整合多线程、内存缓存、本地文件缓存~).zip
第二层缓存是在手机内存层,是将第一层的图片下载到手机内存,这种缓存读取速度非常快,但当图片内存被回收时,图片自然就不会存在了,第三层则是在手机硬盘层,是会缓存到sd卡。但这一层相对于内存的读取速度会慢很...