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

 更新时间:2017年07月24日 09:12:50   作者:小_练  
这篇文章主要介绍了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 使用 ViewPager循环广告位的实现

    Android 使用 ViewPager循环广告位的实现

    本文给大家分享android使用 ViewPager循环广告位的实现,感兴趣的朋友一起学习吧
    2015-11-11
  • Android使用Service实现IPC通信的2种方式

    Android使用Service实现IPC通信的2种方式

    这篇文章主要介绍了Android使用Service实现IPC通信的2种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Flutter使用AnimatedBuilder实现动效复用

    Flutter使用AnimatedBuilder实现动效复用

    Animation和AnimationWidget都是将组件和动画一起完成的。有些时候,我们只是想动效复用,而不关心组件构建,这个时候就可以使用 AnimatedBuilder了。本文详细讲解了AnimatedBuilder的使用,需要的可以参考一下
    2022-04-04
  • 浅谈Android程序与JavaScript脚本的交互

    浅谈Android程序与JavaScript脚本的交互

    这篇文章主要介绍了Android程序与JavaScript的脚本交互,利用js开发安卓应用也是近来的热门话题,特别是随着Facebook的React Native的开源及对Android的官方支持,需要的朋友可以参考下
    2016-04-04
  • Android 单例模式的四种实现方式

    Android 单例模式的四种实现方式

    单例模式作为设计模式之一,使用场景非常多。本文讲述了Android实现单例模式的几种方式
    2021-05-05
  • 详解ListView中多种item的实现方式

    详解ListView中多种item的实现方式

    这篇文章主要给大家介绍了关于ListView中多种item的实现方式,文中通过示例代码介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • ASM的tree api对匿名线程的hook操作详解

    ASM的tree api对匿名线程的hook操作详解

    这篇文章主要为大家介绍了ASM的tree api对匿名线程的hook操作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Android XmlPullParser 方式解析 Xml 文档

    Android XmlPullParser 方式解析 Xml 文档

    这篇文章主要介绍了Android XmlPullParser 方式解析 Xml 文档的相关资料,需要的朋友可以参考下
    2017-06-06
  • Android 软键盘出现不适应的解决办法总结

    Android 软键盘出现不适应的解决办法总结

    这篇文章主要介绍了Android 软键盘出现不适应的解决办法总结的相关资料,需要的朋友可以参考下
    2017-03-03
  • 使用Android原生WebView+Highcharts实现可左右滑动的折线图

    使用Android原生WebView+Highcharts实现可左右滑动的折线图

    折线图是Android开发中经常会碰到的效果,但由于涉及自定义View的知识,对许多刚入门的小白来说会觉得很高深,下面这篇文章主要给大家介绍了关于如何使用Android原生WebView+Highcharts实现可左右滑动的折线图的相关资料,需要的朋友可以参考下
    2022-05-05

最新评论