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 批量下载图片的讲解,如有疑问请留言或者到本站社区进行交流讨论,大家共同进步,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android实现多线程下载图片的方法

    很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天整理出两种比较好的方法来实现远程图片的下载. 方法一.直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection 或URLConnection也可以. static Bitmap downloadBitmapB

  • Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台HTTP接口数据交互,小编刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个坑,总结下最常用的就通过HttpURLConnection来POST提交JSON数据与

  • Android异步下载图片并且缓存图片到本地DEMO详解

    在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML资源,其中包括图片,我们要做的解析XML里面的数据,并且把图片缓存到本地一个cache目录里面,并且用一个自定义的Adapter去填充到LIstView,demo运行效果见下图: 通过这个demo,要学会有一下几点 1.怎么解析一个XML 2.demo中用到的缓存图片到本地一个临时目录的思想是怎样的? 3.AsyncTask类的使用,因为要去异

  • Android带进度条的下载图片示例(AsyncTask异步任务)

    为什么要用异步任务? 在Android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作 ,比如一些耗时操作.如果放在主线程中 会造成阻塞 而当阻塞事件过长时 系统会抛出anr异常.所以我们要使用异步任务.android为我们提供了一个封装好的组件asynctask. AsyncTask可以在子线程中更新ui,封装简化了异步操作.适用于简单的异步处理.如果多个后台任务时就要使用Handler了

  • Android使用AsyncTask下载图片并显示进度条功能

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask.这篇文章给大家介绍Android使用AsyncTask下载图片并显示进度条功能. AsyncTask下载图片并显示下载进度,异步类AsyncTask配合进度条,简练! public class AsyncTaskActivity2 extends Activity { private Button btnDown;//图片框 private ImageView ivImage;//图片URL private sta

  • Android使用okHttp(get方式)下载图片

    一.首先下载Jar包 https://github.com/square/okhttp 如果使用android studio只需要加入依赖compile 'com.squareup.okhttp3:okhttp:3.2.0' 二.下载一张图片并显示 使用的是hanlder的方式 package com.liunan.okhttpdemo2; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import

  • Android编程实现下载图片及在手机中展示的方法

    本文实例讲述了Android编程实现下载图片及在手机中展示的方法.分享给大家供大家参考,具体如下: 在项目开发中从互联网上下载图片是经常用到的功能,再次总结一下 1.普通的下载方式 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android

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

    Android 实现单线程轮循机制批量下载图片 listview 在为item 添加从网上下载下来的图片时, 如果每次都整合一个item时都需要new一个Thread去下载图片,listview长时间滑动时会产生大量线程. 用单线程轮循机制则可以解决这个问题 步骤如下: 1.需要一个任务集合 class imageViewTask{ String path; Bitmap bitmap; int position; } // 任务集合 private List<imageViewTask> i

  • Android多线程+单线程+断点续传+进度条显示下载功能

    效果图 白话分析: 多线程:肯定是多个线程咯 断点:线程停止下载的位置 续传:线程从停止下载的位置上继续下载,直到完成任务为止. 核心分析: 断点: 当前线程已经下载的数据长度 续传: 向服务器请求上次线程停止下载位置的数据 con.setRequestProperty("Range", "bytes=" + start + "-" + end); 分配线程: int currentPartSize = fileSize / mThreadNum

  • Python实现批量下载图片的方法

    本文实例讲述了Python实现批量下载图片的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python #-*-coding:utf-8-*-' #Filename:download_file.py import os,sys import re import urllib import urllib2 base_url = 'xxx' array_url = list() pic_url = list() inner_url = list() def get_a

  • Unity3D实现批量下载图片功能

    本文实例为大家分享了Unity3D实现批量下载图片功能的具体代码,供大家参考,具体内容如下 下一篇文章试试用线程下载 代码如下 using System.IO; using UnityEngine; using System.Net; using System.Collections; public class Test : MonoBehaviour { private string[] _urls=new string[10]; private string [] _localPath =

  • C#实现批量下载图片到本地示例代码

    一.概述 批量下载图片是我们在日常开发中经常会遇到的一个需求,这不,最近工作中就需要批量下载图片到本地,先是通过Excel拼接生成了所有链接地址,然后想到的是通过下载软件来批量下载.可是一想到又要花时间去查找.安装.研究软件,不如自己写个来的快. 以下是使用C#开发的控制台程序代码,通过循环读取文本文件中每一行地址字符串,执行下载并保存到本地文件夹中. 下面话不多说了,来一起看看详细的介绍吧 二.C#实例代码 //using System; //using System.Net; //using

  • Node.js实现批量下载图片简单操作示例

    本文实例讲述了Node.js实现批量下载图片简单操作.分享给大家供大家参考,具体如下: 使用Node.js批量下载图片 首先要获取到图片链接: const img = [ "http://yw-yx.oss-cn-hangzhou.aliyuncs.com/ywwl-jylesson/2019/08/52218400506629423.jpg", "http://yw-yx.oss-cn-hangzhou.aliyuncs.com/ywwl-jylesson/2019/08/

  • nodejs制作爬虫实现批量下载图片

    今天想获取一大批猫的图片,然后就在360流浪器搜索框中输入 猫 ,然后点击图片.就看到了一大波猫的图片: http://image.so.com/i?q=%E7%8... ,我在想啊,要是审查元素,一张张手动下载,多麻烦,所以打算写程序来实现.不写不知道,一写发现里面还是有很多道道的. 1. 爬取图片链接 因为之前也写过nodejs爬虫功能(参见:NodeJS制作爬虫全过程),所以觉得应该很简单,就用cheerio来处理dom啦,结果打印一下啥也没有,后来查看源代码: 发现 waterfall_

  • nodejs批量下载图片的实现方法

    今天想获取一大批猫的图片,然后就在360流浪器搜索框中输入猫,然后点击图片.就看到了一大波猫的图片:http://image.so.com/i?q=%E7%8...,我在想啊,要是审查元素,一张张手动下载,多麻烦,所以打算写程序来实现.不写不知道,一写发现里面还是有很多道道的. 1. 爬取图片链接 因为之前也写过nodejs爬虫功能,所以觉得应该很简单,就用cheerio来处理dom啦,结果打印一下啥也没有,后来查看源代码: 发现waterfall_zoom里面空空如也,查找了一下,发现所有的数

  • python批量下载图片的三种方法

    有三种方法,一是用微软提供的扩展库win32com来操作IE,二是用selenium的webdriver,三是用python自带的HTMLParser解析.win32com可以获得类似js里面的document对象,但貌似是只读的(文档都没找到).selenium则提供了Chrome,IE,FireFox等的支持,每种浏览器都有execute_script和find_element_by_xx方法,可以方便的执行js脚本(包括修改元素)和读取html里面的元素.不足是selenium只提供对py

  • node.js突破nginx防盗链机制,下载图片案例分析 原创

    问题 今天项目需求要求采集几个网站的信息,包括一些区块链统计图表之类的信息. 笔者使用的是node.js+axios库发送get请求来获取在图片,下载到本地.测试代码如下: import fs from 'fs'; import path from 'path'; import http from 'http'; import https from 'https'; const __dirname = path.resolve(); let filePath = path.join(__dirn

随机推荐