Android 实现单线程轮循机制批量下载图片

Android 实现单线程轮循机制批量下载图片,第1张

概述Android实现单线程轮循机制批量下载图片listview在为item添加从网上下载下来的图片时,如果每次都整合一个item时都需要new一个Thread去下载图片,listview长时间滑动时会产生大量线程。

AndroID 实现单线程轮循机制批量下载图片

ListvIEw 在为item 添加从网上下载下来的图片时, 如果每次都整合一个item时都需要new一个Thread去下载图片,ListvIEw长时间滑动时会产生大量线程。

用单线程轮循机制则可以解决这个问题

步骤如下:

1、需要一个任务集合@H_403_13@

class imageVIEwTask{   String path;   Bitmap bitmap;   int position;  } 
// 任务集合  private List<imageVIEwTask> imagevIEws = new ArrayList<MusicAdapter.imageVIEwTask>(); 

2、在构造方法中创建一个线程,通过任务集合中的path去网上下载图片获得bitmap并放置在这个任务中以Message的obj形式传送给handler处理。@H_403_13@

只有在为ListvIEw设置适配器时才需要创建这个工作线程, 且只有一个

(while(true)循环 在activity  调用OnDestroy )才会终止@H_403_13@

// 获得图片bitmap   workThread = new Thread(){    public voID run() {     while(isLoop){      if(!imagevIEws.isEmpty()){       try {        Message msg = new Message();    // 获得图片的bitmap        msg.obj = GetimagevIEwBitmap();        msg.what = HANDLER_LOAD_IMAGEVIEW_SUCCESS;    // 发消息给主线程        handler.sendMessage(msg);               } catch (IOException e) {        e.printstacktrace();       } catch (Exception e) {        e.printstacktrace();       }             }else{       synchronized (workThread) {        try {         //任务队列为空则等待         workThread.wait();        } catch (InterruptedException e) {         e.printstacktrace();        }       }      }           } 
//GetimagevIEwBitmap()方法 // 获得图片的bitmap    private imageVIEwTask GetimagevIEwBitmap() throws Exception,IOException {     imageVIEwTask ivt = imagevIEws.remove(0);     String uri = BasicUri.BasichttpUri+ivt.path;      httpentity entity = new httpUtils().Sethttp(uri,httpUtils.GET_METHOD,null);     byte[] bytes = EntityUtils.toByteArray(entity);     Bitmap bitmap = BitmapUtils.loadBitmap(bytes,50,50);     // 将网上下载的图片存入缓存集合中     map.put(ivt.path,new SoftReference<Bitmap>(bitmap));          ivt.bitmap = bitmap;     return ivt;    }   };   workThread.start();  } 

这个是httpUtils工具@H_403_13@

public class httpUtils {    public final static int GET_METHOD = 1;  public final static int POST_MEHTOD = 2;    /**   * 构造方法   * @param uri 路径   * @param method 发送消息模式 GET_METHOD用get方式传送消息 POST_MEHTOD用post方式传送消息   */  public static httpentity Sethttp(String uri,int method,List<nameValuePair> pairs) throws Exception{   httpClIEnt clIEnt=new DefaulthttpClIEnt();   httpResponse resp = null;   switch (GET_METHOD) {   // 用get方式发送消息   case GET_METHOD:    httpGet get=new httpGet(uri);    resp=clIEnt.execute(get);    break;   // 用post方式发送消息   case POST_MEHTOD:    httpPost post=new httpPost(uri);    httpentity entity=new UrlEncodedFormEntity( pairs,"utf-8");    post.setEntity(entity);    post.setheader("Content-Type","application/x-www-form-urlencoded");    resp=clIEnt.execute(post);    break;   }   return resp.getEntity();  }  } 

3、在自定义adapter 的setVIEw方法中在任务中放置图片下载的path和position, 并为item中的imagevIEw设置标记, 为了在ListvIEw的item中放入图片时的方便。@H_403_13@

// 给imagevIEw设置标记   holder.iv.setTag(position); // 增加任务队列   imageVIEwTask task = new imageVIEwTask();   task.path = musics.get(position).getAlbumpic();   task.position = position;   imagevIEws.add(task);   // 通知工作线程可以下载图片了   synchronized (workThread) {    workThread.notify();   } 

4、传送消息给主线程,让hanler去更新UI

// handler  private Handler handler = new Handler(){   public voID handleMessage(androID.os.Message msg) {    switch (msg.what) {    case HANDLER_LOAD_IMAGEVIEW_SUCCESS:      // 更新UI      imageVIEwTask ivt = (imageVIEwTask) msg.obj;      ImageVIEw iv = (ImageVIEw) ListvIEw.findVIEwWithTag(ivt.position);      if(iv != null){       if(ivt.bitmap != null)        iv.setimageBitmap(ivt.bitmap);      }else{       iv.setimageResource(R.drawable.ic_launcher);      }          break;     }   };  }; 

以上就是使用AndroID 批量下载图片的讲解,如有疑问请留言或者到本站社区进行交流讨论,大家共同进步,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

总结

以上是内存溢出为你收集整理的Android 实现单线程轮循机制批量下载图片全部内容,希望文章能够帮你解决Android 实现单线程轮循机制批量下载图片所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1145545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存