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