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程序设计有所帮助。