Android实现从缓存中读取图片与异步加载功能类
本文实例讲述了Android实现从缓存中读取图片与异步加载功能类。分享给大家供大家参考,具体如下:
在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现。
publicclassAsyncImageLoader{
//SoftReference是软引用,是为了更好的为了系统回收变量
privateHashMap<String,SoftReference<Drawable>>imageCache;
publicAsyncImageLoader(){
imageCache=newHashMap<String,SoftReference<Drawable>>();
}
publicDrawableloadDrawable(finalStringimageUrl,finalImageViewimageView,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,imageView,imageUrl);
}
};
//建立新一个新的线程下载图片
newThread(){
@Override
publicvoidrun(){
Drawabledrawable=loadImageFromUrl(imageUrl);
imageCache.put(imageUrl,newSoftReference<Drawable>(drawable));
Messagemessage=handler.obtainMessage(0,drawable);
handler.sendMessage(message);
}
}.start();
returnnull;
}
publicstaticDrawableloadImageFromUrl(Stringurl){
URLm;
InputStreami=null;
try{
m=newURL(url);
i=(InputStream)m.getContent();
}catch(MalformedURLExceptione1){
e1.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
Drawabled=Drawable.createFromStream(i,"src");
returnd;
}
//回调接口
publicinterfaceImageCallback{
publicvoidimageLoaded(DrawableimageDrawable,ImageViewimageView,StringimageUrl);
}
}
在Adapter中使用的方法为:
publicclassWeiBoAdapaterextendsBaseAdapter{
privateAsyncImageLoaderasyncImageLoader;
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnwbList.size();
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnwbList.get(position);
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
convertView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.weibo,null);
WeiBoHolderwh=newWeiBoHolder();
wh.wbicon=(ImageView)convertView.findViewById(R.id.wbicon);
wh.wbtext=(TextView)convertView.findViewById(R.id.wbtext);
wh.wbtime=(TextView)convertView.findViewById(R.id.wbtime);
wh.wbuser=(TextView)convertView.findViewById(R.id.wbuser);
wh.wbimage=(ImageView)convertView.findViewById(R.id.wbimage);
WeiBoInfowb=wbList.get(position);
if(wb!=null)
{
convertView.setTag(wb.getId());
wh.wbuser.setText(wb.getUserName());
wh.wbtime.setText(wb.getTime());
wh.wbtext.setText(wb.getText(),TextView.BufferType.SPANNABLE);
DrawablecachedImage=asyncImageLoader.loadDrawable(wb.getUserIcon(),wh.wbicon,newImageCallback(){
publicvoidimageLoaded(DrawableimageDrawable,ImageViewimageView,StringimageUrl){
imageView.setImageDrawable(imageDrawable);
}
});
if(cachedImage==null)
{
wh.wbicon.setImageResource(R.drawable.usericon);
}else{
wh.wbicon.setImageDrawable(cachedImage);
}
}
returnconvertView;
}
}
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android视图View技巧总结》、《Android文件操作技巧汇总》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android编程之activity操作技巧总结》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》及《Android资源操作技巧汇总》
希望本文所述对大家Android程序设计有所帮助。