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编程之代码创建布局实例分析

    Android编程之代码创建布局实例分析

    这篇文章主要介绍了Android编程之代码创建布局的方法,结合实例形式分析了Android通过代码创建布局的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 详解Android安全防护之加密算法

    详解Android安全防护之加密算法

    Android应用对安全防范这方面要求越来越高了。特别是金融行业,如果app没有没有做好安全处理,那些很容易被一些Hacker(黑客)所攻击。并不是说做了这些安全防范,这个应用就百分之百的安全的。只是说能够尽可能加大破解难度。本文将详细介绍Android安全防护之加密算法。
    2021-06-06
  • Android EditText密码的隐藏和显示功能

    Android EditText密码的隐藏和显示功能

    这篇文章主要介绍了Android EditText密码的隐藏和显示功能的相关资料,主要是利用EditText和CheckBox 来实现该功能,需要的朋友可以参考下
    2017-07-07
  • Android中Activity之间跳转和参数传递的实例

    Android中Activity之间跳转和参数传递的实例

    本篇文章主要介绍了Android中Activity之间跳转和参数传递的实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • android 实现APP中改变头像图片的实例代码

    android 实现APP中改变头像图片的实例代码

    这篇文章主要介绍了android 实现APP中改变头像图片的实例代码,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • android实现弹出提示框

    android实现弹出提示框

    这篇文章主要为大家详细介绍了android实现弹出提示框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Android中加入名片扫描功能实例代码

    Android中加入名片扫描功能实例代码

    这篇文章主要介绍了Android中加入名片扫描功能实例代码的相关资料,需要的朋友可以参考下
    2016-03-03
  • Activity跳转时生命周期跟踪的实例

    Activity跳转时生命周期跟踪的实例

    下面小编就为大家带来一篇Activity跳转时生命周期跟踪的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Android Studio3.0新特性及安装图文教程

    Android Studio3.0新特性及安装图文教程

    这篇文章主要为大家详细介绍了Android Studio3.0安装配置方法图文教程,以及Android Studio3.0新特性,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Android基于虹软(ArcSoft)实现人脸识别

    Android基于虹软(ArcSoft)实现人脸识别

    人工智能时代快速来临,其中人脸识别是当前比较热门的技术,在国内也越来越多的运用,例如刷脸打卡,刷脸APP,身份识别,人脸门禁等。本文将为大家介绍Android基于虹软(ArcSoft)实现人脸识别的demo,快来跟随小编一起学习吧
    2021-12-12

最新评论