全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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管理器实现下载图片功能  # 发送消息  # 网上  # 单线程  # 在这个  # 如有  # 才会  # 长时间  # 希望能  # 自定义  # 只有一个  # 每次都  # 谢谢大家  # 则可  # 并为  # 时才  # 可以下载  # 创建一个  # 中以  # 解决这个问题 


相关文章: 实现虚拟支付需哪些建站技术支撑?  如何用西部建站助手快速创建专业网站?  Thinkphp 中 distinct 的用法解析  如何在宝塔面板中修改默认建站目录?  如何在云主机上快速搭建网站?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  想学网站制作怎么学,建立一个网站要花费多少?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  非常酷的网站设计制作软件,酷培ai教育官方网站?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何用VPS主机快速搭建个人网站?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  如何在万网主机上快速搭建网站?  如何通过IIS搭建网站并配置访问权限?  如何选择最佳自助建站系统?快速指南解析优劣  如何选择PHP开源工具快速搭建网站?  在线教育网站制作平台,山西立德教育官网?  如何快速搭建高效可靠的建站解决方案?  香港服务器租用每月最低只需15元?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  建站之星如何保障用户数据免受黑客入侵?  如何快速打造个性化非模板自助建站?  网站制作壁纸教程视频,电脑壁纸网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  ,制作一个手机app网站要多少钱?  宁波免费建站如何选择可靠模板与平台?  北京专业网站制作设计师招聘,北京白云观官方网站?  常州自助建站工具推荐:低成本搭建与模板选择技巧  建站之星多图banner生成与模板自定义指南  微信小程序制作网站有哪些,微信小程序需要做网站吗?  建站主机是否等同于虚拟主机?  湖北网站制作公司有哪些,湖北清能集团官网?  如何设计高效校园网站?  如何快速生成橙子建站落地页链接?  西安专业网站制作公司有哪些,陕西省建行官方网站?  图册素材网站设计制作软件,图册的导出方式有几种?  如何彻底删除建站之星生成的Banner?  如何用y主机助手快速搭建网站?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何在阿里云完成域名注册与建站?  建站VPS选购需注意哪些关键参数?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  如何用腾讯建站主机快速创建免费网站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  jQuery 常见小例汇总 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。