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

发布时间 - 2026-01-11 02:28:53    点击率:

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

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

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

步骤如下:

1、需要一个任务集合

class imageViewTask{ 
  String path; 
  Bitmap bitmap; 
  int position; 
 } 

// 任务集合 

 private List<imageViewTask> imageviews = new ArrayList<MusicAdapter.imageViewTask>(); 

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

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

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

// 获得图片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工具

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中放入图片时的方便。

// 给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异步下载图片并且缓存图片到本地DEMO详解  # Android带进度条的下载图片示例(AsyncTask异步任务)  # Android编程实现下载图片及在手机中展示的方法  # Android使用AsyncTask下载图片并显示进度条功能  # Android实现多线程下载图片的方法  # Android使用okHttp(get方式)下载图片  # Android DownloadMananger管理器实现下载图片功能  # 发送消息  # 网上  # 单线程  # 在这个  # 如有  # 才会  # 长时间  # 希望能  # 自定义  # 只有一个  # 每次都  # 谢谢大家  # 则可  # 并为  # 时才  # 可以下载  # 创建一个  # 中以  # 解决这个问题 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel安装步骤详细教程_Laravel环境搭建指南  bing浏览器学术搜索入口_bing学术文献检索地址  想要更高端的建设网站,这些原则一定要坚持!  如何撰写建站申请书?关键要点有哪些?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  如何生成腾讯云建站专用兑换码?  如何快速搭建FTP站点实现文件共享?  Python函数文档自动校验_规范解析【教程】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  历史网站制作软件,华为如何找回被删除的网站?  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel如何使用Service Container和依赖注入?(代码示例)  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何在橙子建站上传落地页?操作指南详解  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  bootstrap日历插件datetimepicker使用方法  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  中国移动官方网站首页入口 中国移动官网网页登录  高防服务器租用如何选择配置与防御等级?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  实现点击下箭头变上箭头来回切换的两种方法【推荐】  QQ浏览器网页版登录入口 个人中心在线进入  如何快速生成专业多端适配建站电话?  太平洋网站制作公司,网络用语太平洋是什么意思?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  网站图片在线制作软件,怎么在图片上做链接?  如何在七牛云存储上搭建网站并设置自定义域名?  php 三元运算符实例详细介绍  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  如何快速搭建自助建站会员专属系统?  Laravel如何配置任务调度?(Cron Job示例)  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  ,在苏州找工作,上哪个网站比较好?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  焦点电影公司作品,电影焦点结局是什么?  如何快速搭建高效WAP手机网站?  java获取注册ip实例  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Laravel如何构建RESTful API_Laravel标准化API接口开发指南