ListView异步下载图片的另一种实现
2011-04-01 10:40 shy.ang 阅读(927) 评论(0) 编辑 收藏 举报这个是对ListView中异步下载图片的另一种实现方案,关键词:new Thread Handler message
http://www.iteye.com/topic/685986
相比于AsyncTask(android--Imagedownloader),更加灵活,但没有AsyncTask处理的更细节和完善
算法:在Adapter类的getView中
rowView = convertView;
若rowView 为空,就和XML相关联,
根据rowView(以rowView为参数)生成TextImage视图
rowView以Tag方式存储这个TextImage视图:rowView.setTag(TextImageView);
若不为空,就根据rowView获得一个作为Tag存储的TextImage视图:rowView.getTag();
//TextImage视图和带有inflate的rowView的关系是......只是相互能够引用到(得到)的关系,但这个TextImage视图和rowView中inflate指出的布局没有关系,TextImage中下载的Image和rowView也没有关系。 在TextImageView视图中设置了BaseView,根据BaseView构造TextImageView 可以在TextImage视图中对TextView和ImageView分别和BaseView.(inflate指出的xml布局)相关联。
获得listView所在项的内容TextImage
获得TextImage中的imageUrl
获得TextImage视图中的ImageView
设置ImageView的Tag为imageUrl
下载imageUrl对应的Image,并把该Image添加到以imageUrl为Tag的ImageView中
其中依靠Handler消息处理机制来把在子线程中下载的Image传递给UI线程。
下面下载参数是实现了接口:
Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {
public void imageLoaded(Drawable imageDrawable, String imageUrl) {ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl);if (imageViewByTag != null) {imageViewByTag.setImageDrawable(imageDrawable);}}});
Handler 允许你发送并处理消息、和一个线程消息队列相关联的Runnable对象。每一个handler实例都伴随着一个单独的线程以及这个线程的消息队列。当你创建一个handler时,它就和创建它的线程、线程消息队列绑定了。从那时起,它将发送消息和Runnables到线程的消息队列,然后当消息出队列的时候执行它们。
Handler主要有两个用处:一个是调度消息和Runnables使它们在将来被执行;另一个是将一个action入队使之在另一个线程被执行。
Handler有很多调度消息的方法,其中post系列是将Runnables入队使它们在被接收到的时候被消息队列调用;而sendMessages系列是将一个有一包数据的消息对象入队,它们将会被Handler的handleMessage(Message)方法处理。 你可以将发送或者接收到的项目交给消息队列立即处理,也可以推迟或者设定一个绝对时间来处理。 当一个应用进程被创建,主线程负责运行消息队列,用来处理级别高的应用对象(如activity,broadcast receiver等)。你可以创建自己的线程,通过Handler来和主线程通信:在自己的线程中调用同样的post或者sendMessage方法,这样,已知的消息或者Runnables将会被调度到Handler的消息队列并在适当的时候被处理。一般是自己的线程捕获消息然后发送给主线程,然后主线程接收并处理消息。
自己线程: Message message = (其中一种构造函数)obtainMessage(int , Object) // int是用户定义的消息码 Object是消息带着的任意对象 handler.sendMessage(massage);
主线程:Handler handler = new Handler(){ public void handleMessage(Message msg){}