ListView异步加载

 1    @Override
2 public View getView(int position, View convertView, ViewGroup parent) {
3   …………
4 ViewHolder VH = null;
5   …………
10       VH.mImageView.setTag(position);
11       VH.mThumb.setImageDrawable(imageLoader.loadDrawable(position,
12         new ImageCallback() {
13    public void imageLoaded(Drawable imageDrawable, int position) {
14   ImageView imageViewByTag = (ImageView) mList.findViewWithTag(position);
15   if (imageViewByTag != null) {
16   imageViewByTag.setImageDrawable(imageDrawable);
17   }
18   }
19   }));
20   }
21 private static LruCache<Long, Drawable> mCache = new LruCache<Long, Drawable>(100);
22 public class AsyncImageLoader {
23
24 public Drawable loadDrawable(final int position, final ImageCallback callback){
25
26 Drawable d = null;
27 d = mCache.get(position);
28 if (d == null) {
29 final Handler handler=new Handler(){
30 @Override
31 public void handleMessage(Message msg) {
32 callback.imageLoaded((Drawable) msg.obj, position);
33 }
34 };
35 Thread t = new Thread(){
36 public void run() {
37 Drawable drawable = Utils.getDrawable(mContext, position, 1, mMyDefaultIcon);
38 Drawable value = mCache.get(position);//cache有可能已经被更改了,所以重新取一次
39 if (value == null) {
40 mCache.put(position, drawable);
41 } else {
42 drawable = value;
43 }
44 handler.sendMessage(handler.obtainMessage(0,drawable));
45 };
46 };
47 t.setPriority(Thread.MIN_PRIORITY);
48 t.start();
49 return mMyDefaultIcon;
50 } else {
51 return d;
52 }
53 }
54 }
55
56 public interface ImageCallback{
57 public void imageLoaded(Drawable imageDrawable, int position);
58 }
59


  这个是在http://www.oschina.net/code/snippet_176897_7207基础上修改的。主要为了加入LruCache

 

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

posted @ 2012-01-04 22:26  Hecker385  阅读(354)  评论(0编辑  收藏  举报