代码改变世界

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){}