图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略。今天首先介绍一下本地缓存图片
 
 
在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出。针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载上面缓存到本地,以后如果本地有就直接从本地加载。图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略。今天首先介绍一下本地缓存图片。 
首先看一下异步加载缓存本地代码:

复制代码代码如下:
publicclassAsyncBitmapLoader 

/** 
*内存图片软引用缓冲 
*/ 
privateHashMap<String,SoftReference<Bitmap>>imageCache=null; 
publicAsyncBitmapLoader() 

imageCache=newHashMap<String,SoftReference<Bitmap>>(); 

publicBitmaploadBitmap(finalImageViewimageView,finalStringimageURL,finalImageCallBackimageCallBack) 

//在内存缓存中,则返回Bitmap对象 
if(imageCache.containsKey(imageURL)) 

SoftReference<Bitmap>reference=imageCache.get(imageURL); 
Bitmapbitmap=reference.get(); 
if(bitmap!=null) 

returnbitmap; 


else 

/** 
*加上一个对本地缓存的查找 
*/ 
StringbitmapName=imageURL.substring(imageURL.lastIndexOf("/")+1); 
FilecacheDir=newFile("/mnt/sdcard/test/"); 
File[]cacheFiles=cacheDir.listFiles(); 
inti=0; 
if(null!=cacheFiles){ 
for(;i<cacheFiles.length;i++) 

if(bitmapName.equals(cacheFiles[i].getName())) 

break; 


if(i<cacheFiles.length) 

returnBitmapFactory.decodeFile("/mnt/sdcard/test/"+bitmapName); 



finalHandlerhandler=newHandler() 

/*(non-Javadoc) 
*@seeandroid.os.Handler#handleMessage(android.os.Message) 
*/ 
@Override 
publicvoidhandleMessage(Messagemsg) 

//TODOAuto-generatedmethodstub 
imageCallBack.imageLoad(imageView,(Bitmap)msg.obj); 

}; 
//如果不在内存缓存中,也不在本地(被jvm回收掉),则开启线程下载图片 
newThread() 

/*(non-Javadoc) 
*@seejava.lang.Thread#run() 
*/ 
@Override 
publicvoidrun() 

//TODOAuto-generatedmethodstub 
InputStreambitmapIs=HttpUtils.getStreamFromURL(imageURL); 
Bitmapbitmap=BitmapFactory.decodeStream(bitmapIs); 
imageCache.put(imageURL,newSoftReference<Bitmap>(bitmap)); 
Messagemsg=handler.obtainMessage(0,bitmap); 
handler.sendMessage(msg); 
Filedir=newFile("/mnt/sdcard/test/"); 
if(!dir.exists()) 

dir.mkdirs(); 

FilebitmapFile=newFile("/mnt/sdcard/test/"+ 
imageURL.substring(imageURL.lastIndexOf("/")+1)); 
if(!bitmapFile.exists()) 

try 

bitmapFile.createNewFile(); 

catch(IOExceptione) 

//TODOAuto-generatedcatchblock 
e.printStackTrace(); 


FileOutputStreamfos; 
try 

fos=newFileOutputStream(bitmapFile); 
bitmap.compress(Bitmap.CompressFormat.PNG, 
100,fos); 
fos.close(); 

catch(FileNotFoundExceptione) 

//TODOAuto-generatedcatchblock 
e.printStackTrace(); 

catch(IOExceptione) 

//TODOAuto-generatedcatchblock 
e.printStackTrace(); 


}.start(); 
returnnull; 

publicinterfaceImageCallBack 

publicvoidimageLoad(ImageViewimageView,Bitmapbitmap); 

这是一个封装好的异步加载图片类,缓存了两份,一份是使用软引用缓存到内存中,一份是缓存到本地sd卡,如果内存中没有,则从本地查找,如果本地没有则从网络获取图片。

复制代码代码如下:
publicclassHttpUtils{ 
publicstaticInputStreamgetStreamFromURL(StringimageURL){ 
InputStreamin=null; 
try{ 
URLurl=newURL(imageURL); 
HttpURLConnectionconnection=(HttpURLConnection)url.openConnection(); 
in=connection.getInputStream();

}catch(Exceptione){ 
//TODOAuto-generatedcatchblock 
e.printStackTrace(); 

returnin;


这是一个访问网络获取类。不细说了。 
下面看一下如何使用封装好的异步加载图片的类:

复制代码代码如下:
publicclassImageCacheActivityextendsActivity{ 
/**Calledwhentheactivityisfirstcreated.*/ 
privateListViewlistview; 
@Override 
publicvoidonCreate(BundlesavedInstanceState){ 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
listview=(ListView)findViewById(R.id.listView_list); 
MyAdapteradapter=newMyAdapter(); 
listview.setAdapter(adapter); 

privateclassMyAdapterextendsBaseAdapter{ 
privateAsyncBitmapLoaderasyncBitmapLoader; 
publicMyAdapter(){ 
asyncBitmapLoader=newAsyncBitmapLoader(); 

@Override 
publicintgetCount(){ 
//TODOAuto-generatedmethodstub 
return10; 

@Override 
publicObjectgetItem(intposition){ 
//TODOAuto-generatedmethodstub 
returnnull; 

@Override 
publiclonggetItemId(intposition){ 
//TODOAuto-generatedmethodstub 
return0; 

@Override 
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ 
//TODOAuto-generatedmethodstub 
if(convertView==null){ 
convertView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.list_item,null); 

ImageViewimage=(ImageView)convertView.findViewById(R.id.addexam_list_icon); 
StringimageURL="http://s.ata.net.cn/4f98db46908987a21a000003/logo/2012/04/114_80aaf295c083d07a496743699aac3193.png"; 
Bitmapbitmap=asyncBitmapLoader.loadBitmap(image,imageURL,newImageCallBack(){

@Override 
publicvoidimageLoad(ImageViewimageView,Bitmapbitmap){ 
//TODOAuto-generatedmethodstub 
imageView.setImageBitmap(bitmap); 

}); 
if(bitmap==null) 

image.setImageResource(R.drawable.ic_launcher); 

else 

image.setImageBitmap(bitmap); 
}

returnconvertView; 
}


android异步加载图片并缓存到本地实现方法的更多相关文章

  1. 演化理解 Android 异步加载图片(转)

    演化理解 Android 异步加载图片(转)http://www.cnblogs.com/CJzhang/archive/2011/10/20/2218474.html

  2. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

  3. Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

      Android 高手进阶(21)  版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...

  4. 实例演示Android异步加载图片

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  5. 实例演示Android异步加载图片(转)

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  6. 演化理解 Android 异步加载图片

    原文:http://www.cnblogs.com/ghj1976/archive/2011/05/06/2038738.html#3018499 在学习"Android异步加载图像小结&q ...

  7. wemall app商城源码中基于JAVA的Android异步加载图片管理器代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  8. android异步加载图片

    import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; impo ...

  9. Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片

    一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...

随机推荐

  1. weblogic对jms实现的QueueConnection实现与TopicConnection实现问题

    今天看了一段之前同事写jms的代码,觉得好像不对,但是不可能,生产上用的代码.刚开始想了下,脑子没转过弯来,后来一想是个简单的问题 代码如下: topicConnection = (TopicConn ...

  2. chrome 下载插件包及离线安装

    最近需要测试http rest服务,由于chrome插件的轻便,首先想到了用chrome插件,在google商店找到Advanced Rest Client,用了一阵感觉不错. 于是项目组其他同事也要 ...

  3. Oracle RAC inventory.xml损坏后如何修复

    不建议直接修改该文件 1.从其它节点拷贝一份 2.使用runInstaller工具(这个工具位于<GI_HOME>/oui/bin路径下)重建inventory.xml文件 步骤1:添加G ...

  4. 单位px 转换成 rem

    <script type="text/javascript"> var oHtml = document.documentElement; getSize(); win ...

  5. Swift游戏实战-跑酷熊猫 14 熊猫打滚

    这节内容我们来实现熊猫打滚.思路是这样的,当熊猫起跳时记录他的Y坐标,落到平台上的时候再记录它的Y坐标.两个坐标之间的差要是大于一定数值就判断它从高处落下要进行打滚缓冲.至此跑酷熊猫已经像一个游戏的样 ...

  6. JS小练习 留言功能

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 配置DruidDataSource参考(com.alibaba.druid.pool.DruidDataSource)

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-met ...

  8. Java 中的System.exit

    在java 中退出程序,经常会使用System.exit(1) 或 System.exit(0). 查看System.exit()方法的源码,如下 /** * Terminates the curre ...

  9. 《zw版Halcon与delphi系列原创教程》发布说明

    <zw版Halcon与delphi系列原创教程>发布说明 zw转载的<台湾nvp系列halcon-delphi教程>,虽然很多,不过基本上都是从cnc.数控角度的demo..  ...

  10. Javascript与C#编码解码

    (一) Javascript与C#编码解码的对应关系 http://www.jb51.net/article/44062.htm 这篇文章主要是对JS与C#编码解码进行了详细的介绍,需要的朋友可以过来 ...