网上软应用的例子很多,我也是借鉴别人修改了下,推荐一个网址:http://www.iteye.com/topic/685986
之前总是不太理解,今天认真的推敲下,记录下来方便以后用到.
HashMap<String, SoftReference<Drawable>> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了。
机制:简单来说,她会帮助我们管理内存,防止内存溢出,另外一点也就相当于map,临时缓存些图片drawable让我们可以直接引用,很好了解决了OOM异常.
实现代码片段:
-
packagecom.Tianyou.Mobile.Common;
-
-
importjava.io.IOException;
-
importjava.io.InputStream;
-
importjava.lang.ref.SoftReference;
-
importjava.net.MalformedURLException;
-
importjava.net.URL;
-
importjava.util.HashMap;
-
-
importcom.Tianyou.Mobile.Util.MyUtil;
-
-
importandroid.graphics.Bitmap;
-
importandroid.graphics.drawable.BitmapDrawable;
-
importandroid.graphics.drawable.Drawable;
-
importandroid.os.Handler;
-
importandroid.os.Message;
-
-
-
-
-
-
-
-
publicclassAsyncImageLoader{
-
-
privateHashMap<String,SoftReference<Drawable>>imageCache;
-
-
publicAsyncImageLoader(){
-
imageCache=newHashMap<String,SoftReference<Drawable>>();
-
}
-
-
-
-
-
-
-
-
-
-
-
publicDrawableloadDrawable(finalStringimageUrl,
-
finalImageCallbackimageCallback){
-
if(imageCache.containsKey(imageUrl)){
-
SoftReference<Drawable>softReference=imageCache.get(imageUrl);
-
Drawabledrawable=softReference.get();
-
if(drawable!=null){
-
returndrawable;
-
}
-
}
-
finalHandlerhandler=newHandler(){
-
publicvoidhandleMessage(Messagemessage){
-
imageCallback.imageLoaded((Drawable)message.obj,imageUrl);
-
}
-
};
-
-
newThread(){
-
@Override
-
publicvoidrun(){
-
Drawabledrawable=loadImageFromUrl(imageUrl);
-
-
imageCache.put(imageUrl,newSoftReference<Drawable>(drawable));
-
Messagemessage=handler.obtainMessage(0,drawable);
-
handler.sendMessage(message);
-
}
-
}.start();
-
returnnull;
-
}
-
-
-
-
-
-
-
-
publicstaticDrawableloadImageFromUrl(StringimageURL){
-
-
Bitmapbitmap=MyUtil.GetBitmap(imageURL,100);
-
Drawabledrawable=newBitmapDrawable(bitmap);
-
returndrawable;
-
-
}
-
-
-
publicinterfaceImageCallback{
-
publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl);
-
}
-
-
}
上面这个类斯通见惯了,大部分都是这样实现的,我现在要讲一点,也是迷惑我很久了一点(回调接口运用)本人基础不好,所以卡在这里了,
在listview中的getview方法中要调用这个方法:
代码片段:
-
publicDrawablegetDrawable(AsyncImageLoaderasyncImageLoader,
-
StringimageUrl,finalImageViewimageView){
-
Drawabledrawable=asyncImageLoader.loadDrawable(imageUrl,
-
newImageCallback(){
-
@Override
-
publicvoidimageLoaded(DrawableimageDrawable,
-
StringimageUrl){
-
if(imageDrawable!=null)
-
imageView.setImageDrawable(imageDrawable);
-
else
-
imageView.setImageResource(R.drawable.u6_normal);
-
}
-
});
-
returndrawable;
-
}
这个方法作用:获取软用中的图片,其实在我们首次进入listview中的时候,软应用是不起作用的,只是用来下载图片保存至sd卡和软引用中.这个方法就是执行了这些操作,对于参数imageView 就是在要把获取的drawable设置进去.
执行的顺利:首先我们调用的是loadDrawable这个方法,然后查找软引用中有没有该drawable,没有的话则线程下载,下载ok后会执行handleMessage中imageCallback.imageLoaded((Drawable) message.obj, imageUrl);然后执行我们已经实现了这个接口.
在getiview 中执行代码片段:
-
Drawabledrawable=getDrawable(asyncImageLoader,Image_L,
-
holder.iv_image);
-
-
if(drawable!=null)
-
holder.iv_image.setImageDrawable(drawable);
当我们下滑动后,然后在上滑动的时候软应用起到了效果,效率很快哦,可以和新浪聘美了,呵呵,玩笑,要优化的地方还很多.
分享到:
相关推荐
android listView图片异步加载(拖动时不加载,双缓存)
Android listview实现图片的异步加载Demo.zip
ListView和GridView里加载图片,有很多种实现方式,但是如果用不好很容易导致各种问题,比如内存溢出、图片错位、体验效果差等问题。 现在我将开源项目GreenDroid里异步加载图片代码提取出来做成一个jar包。有效...
Android Listview异步加载图片,图片错位解决方案
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...
Android 异步加载图片,对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片就更新,界面比较简单,当然你可以做成比较好的,像很多好...
Android实现ListView异步加载图片
android listview异步加载图片实例 用到了线程池 下载的图片会保存到本地 并在数据库中保留记录 再次加载时会直接从本地读取
安卓Android源码——listview实现图片的异步加载.zip
Android ListView异步加载图片,优化滚动效果,不卡顿、流畅显示。主要给新人了解ListView和AsyncTask、Json等使用。
Android中ListView全面完美的网络图片的异步加载,两种加载方式,利用了LruCache缓存,动态加载,只加载可见部分的图片.
简洁 明确 listview异步加载图片
ListView的异步加载图片并缓存,可以实现异步加载数据,异步加载图片,缓存图片,并且实现退出删除图片缓存
ListView异步加载图片,图片错位问题解决方案 * 问题分析:我们在使用AsyncTask异步下载图片的时候,经常会用到convertView的重用,一般情况下,滑动后第一个可见的元素(我们给它命个名,称为A1)和 * listview...
android listview 异步加载网络图片
listview优化和异步加载全攻略,对android下listview的异步加载和优化,进行了优化,完整而且完美,欢迎下载
Android Listview 分页显示与异步下载图片 按照内存剩余大小随机释放已读图片与重新下载释放的图片
NULL 博文链接:https://zjingye.iteye.com/blog/1936268