欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现从缓存中读取图片与异步加载功能类

程序员文章站 2024-03-06 11:10:19
本文实例讲述了android实现从缓存中读取图片与异步加载功能类。分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以...

本文实例讲述了android实现从缓存中读取图片与异步加载功能类。分享给大家供大家参考,具体如下:

在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现。

public class asyncimageloader {
  //softreference是软引用,是为了更好的为了系统回收变量
  private hashmap<string, softreference<drawable>> imagecache;
  public asyncimageloader() {
    imagecache = new hashmap<string, softreference<drawable>>();
  }
  public drawable loaddrawable(final string imageurl,final imageview imageview, final imagecallback imagecallback){
    if (imagecache.containskey(imageurl)) {
      //从缓存中获取
      softreference<drawable> softreference = imagecache.get(imageurl);
      drawable drawable = softreference.get();
      if (drawable != null) {
        return drawable;
      }
    }
    final handler handler = new handler() {
      public void handlemessage(message message) {
        imagecallback.imageloaded((drawable) message.obj, imageview,imageurl);
      }
    };
    //建立新一个新的线程下载图片
    new thread() {
      @override
      public void run() {
        drawable drawable = loadimagefromurl(imageurl);
        imagecache.put(imageurl, new softreference<drawable>(drawable));
        message message = handler.obtainmessage(0, drawable);
        handler.sendmessage(message);
      }
    }.start();
    return null;
  }
  public static drawable loadimagefromurl(string url){
    url m;
    inputstream i = null;
    try {
      m = new url(url);
      i = (inputstream) m.getcontent();
    } catch (malformedurlexception e1) {
      e1.printstacktrace();
    } catch (ioexception e) {
      e.printstacktrace();
    }
    drawable d = drawable.createfromstream(i, "src");
    return d;
  }
  //回调接口
  public interface imagecallback {
    public void imageloaded(drawable imagedrawable,imageview imageview, string imageurl);
  }
}

在adapter中使用的方法为:

public class weiboadapater extends baseadapter{
    private asyncimageloader asyncimageloader;
    @override
    public int getcount() {
      // todo auto-generated method stub
      return wblist.size();
    }
    @override
    public object getitem(int position) {
      // todo auto-generated method stub
      return wblist.get(position);
    }
    @override
    public long getitemid(int position) {
      // todo auto-generated method stub
      return position;
    }
    @override
    public view getview(int position, view convertview, viewgroup parent) {
      // todo auto-generated method stub
      convertview = layoutinflater.from(getapplicationcontext()).inflate(r.layout.weibo, null);
      weiboholder wh = new weiboholder();
      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);
      weiboinfo wb = 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);
        drawable cachedimage = asyncimageloader.loaddrawable(wb.getusericon(), wh.wbicon, new imagecallback(){
          public void imageloaded(drawable imagedrawable,imageview imageview,string imageurl){
            imageview.setimagedrawable(imagedrawable);
          }
        });
        if (cachedimage == null)
        {
          wh.wbicon.setimageresource(r.drawable.usericon);
        }else{
          wh.wbicon.setimagedrawable(cachedimage);
        }
      }
      return convertview;
    }
}

更多关于android相关内容感兴趣的读者可查看本站专题:《android控件用法总结》、《android视图view技巧总结》、《android文件操作技巧汇总》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android编程之activity操作技巧总结》、《android编程开发之sd卡操作方法汇总》、《android开发入门与进阶教程》及《android资源操作技巧汇总

希望本文所述对大家android程序设计有所帮助。