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

Android实现ListView异步加载的方法(改进版)

程序员文章站 2024-03-07 12:34:09
本文实例讲述了android实现listview异步加载的方法。分享给大家供大家参考,具体如下: @override public view getvie...

本文实例讲述了android实现listview异步加载的方法。分享给大家供大家参考,具体如下:

@override
   public view getview(int position, view convertview, viewgroup parent) {
         …………
     viewholder vh = null;
         …………
      vh.mimageview.settag(position);
      vh.mthumb.setimagedrawable(imageloader.loaddrawable(position,
        new imagecallback() {
          public void imageloaded(drawable imagedrawable, int position) {
            imageview imageviewbytag = (imageview) mlist.findviewwithtag(position);
            if (imageviewbytag != null) {
              imageviewbytag.setimagedrawable(imagedrawable);
              }
            }
         }));
  }
  private static lrucache<long, drawable> mcache = new lrucache<long, drawable>(100);
  public class asyncimageloader {
    public drawable loaddrawable(final int position, final imagecallback callback){
      drawable d = null;
      d = mcache.get(position);
      if (d == null) {
        final handler handler=new handler(){
          @override
          public void handlemessage(message msg) {
            callback.imageloaded((drawable) msg.obj, position);
          }
        };
        thread t = new thread(){
          public void run() {
            drawable drawable = utils.getdrawable(mcontext, position, 1, mmydefaulticon);
            drawable value = mcache.get(position);//cache有可能已经被更改了,所以重新取一次
            if (value == null) {
              mcache.put(position, drawable);
            } else {
              drawable = value;
            }
            handler.sendmessage(handler.obtainmessage(0,drawable));
          };
        };
        t.setpriority(thread.min_priority);
        t.start();
        return mmydefaulticon;
      } else {
        return d;
      }
    }
  }
  public interface imagecallback{
    public void imageloaded(drawable imagedrawable, int position);
  }

这个是在前面一篇基础上修改的。主要为了加入lrucache

后来发现,这种方法要不停的开辟新的线程,效率并不是很高。最后改为加入一后台线程,不停从后进先出队列中取出任务进行处理。

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

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