图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用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. Mysql主从库同步错误:1062 Error 'Duplicate entry '1438019'

    mysql主从库同步错误:1062 Error 'Duplicate entry '1438019' for key 'PRIMARY'' on query mysql主从库在同步时会发生1062 L ...

  2. java io读书笔记(4)字符数据

    Number只是java程序中需要读出和写入的一种数据类型.很多java程序需要处理有一大堆的字符组成的text,因为计算机真正懂得的只有数字,因此,字符按照某种编码规则,和数字对应. 比如:在ASC ...

  3. Winform 基本属性

    WinForm--- 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序特点:不需要联网也可以打开使用部分功能但是现在的情况是许多功能依然需要互联网的支持 代码部分在用户电脑上执行 WinFo ...

  4. [转]JAVA程序员一定知道的优秀第三方库(2016版)

    原文地址:http://blog.csdn.net/zxc123e/article/details/51418163 几乎每个程序员都知道要“避免重复发明轮子”的道理——尽可能使用那些优秀的第三方框架 ...

  5. POJ 1286 Necklace of Beads(Polya原理)

    Description Beads of red, blue or green colors are connected together into a circular necklace of n ...

  6. React-Native坑1:Invariant Violation:Application 项目名 has not been registered.

    React-Native坑1:Invariant Violation:Application 项目名 has not been registered. 字数347 阅读1421 评论3 喜欢7 前言 ...

  7. C 排序法

    1.冒泡法,相邻的两个数值,进行比较,满足条件的进行互换 #include <stdio.h> int main() { int index, j, tmp; , , ,}; ; inde ...

  8. 对于Mybatis在C#.Net中个人使用的总结(一) Mybatis 的结果映射

    (图片中的文字上传之后就都看不清,我再图片的下边会用斜体字标清) 首先我在项目中使用Mybatis 是用XML完成映射的.至于XML这门语言,其实很简单的(对于入门来说,因为我是刚入门哈~),如果你还 ...

  9. angular filter

    日期格式化: <span ng-bind="topShowList.sendTime|dateFormat|date:'MM-dd HH:mm'"></span& ...

  10. Power Gating的设计(模块二)

    针对lower power的验证,由cpf/upf来建模,包括: 1)power gating的功能模型(在power gate之后将output force为x) 2)isolation功能模型: ...