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

很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天整理出两种比较好的方法来实现远程图片的下载。

方法一、直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection 或URLConnection也可以。

 static Bitmap downloadBitmapByCwj(String url) {
 final AndroidHttpClient client = AndroidHttpClient.newInstance("Android123");
 final HttpGet getRequest = new HttpGet(url); 

 try {
  HttpResponse response = client.execute(getRequest);
  final int statusCode = response.getStatusLine().getStatusCode();
  if (statusCode != HttpStatus.SC_OK) {
   Log.e("cwjDebug", "Error " + statusCode + " while retrieving bitmap from " + url);
   return null;
  } 

  final HttpEntity entity = response.getEntity();
  if (entity != null) {
   InputStream inputStream = null;
   try {
    inputStream = entity.getContent();
    final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    return bitmap;
   } finally {
    if (inputStream != null) {
     inputStream.close();
    }
    entity.consumeContent();
   }
  }
 } catch (Exception e) {
   getRequest.abort();
  Log.e("android123Debug", "Error while retrieving bitmap from " + url, e.toString());
 } finally {
  if (client != null) {
   client.close();
  }
 }
 return null;
}

这里Android开发网提醒大家,BitmapFactory类的decodeStream方法在网络超时或较慢的时候无法获取完整的数据,这里我们通过继承FilterInputStream类的skip方法来强制实现flush流中的数据,主要原理就是检查是否到文件末端,告诉http类是否继续。

static class FlushedInputStream extends FilterInputStream {
 public FlushedInputStream(InputStream inputStream) {
  super(inputStream);
 } 

 @Override
 public long skip(long n) throws IOException {
  long totalBytesSkipped = 0L;
  while (totalBytesSkipped < n) {
   long bytesSkipped = in.skip(n - totalBytesSkipped);
   if (bytesSkipped == 0L) {
     int byte = read();
     if (byte < 0) {
      break; // we reached EOF
     } else {
      bytesSkipped = 1; // we read one byte
     }
   }
   totalBytesSkipped += bytesSkipped;
  }
  return totalBytesSkipped;
 }
}

方法二、AsyncTask异步任务

从Android 1.5固件开始Google提供了一个AsyncTask类来帮助开发者处理异步下载的实现,相对于Thread而言他可以运行在UI线程中,其内部的实现是从Java 5开始的并发包concurrent中派生而来的,总体实现比较可靠就是资源占用略大了些。不过使用起来比简单。这里下载图片类 ImageDownloader类的download方法可以很好的处理实现UI显示等操作,参数一url为远程server上文件的url,第二个参数为imageview对象,可以直接让imageview显示出下载的远程图片。

 public class ImageDownloader { 

 public void download(String url, ImageView imageView) {
   BitmapDownloaderTask task = new BitmapDownloaderTask(imageView);
   task.execute(url);
  }
 } 

}

有关具体的AsyncTask类实现,考虑到图片可能较大,为了给JVM充分的空间存储,这里Android123推荐大家使用弱引用来保存ImageView对象。

class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
 private String url;
 private final WeakReference<ImageView> imageViewReference; //使用WeakReference解决内存问题 

 public BitmapDownloaderTask(ImageView imageView) {
  imageViewReference = new WeakReference<ImageView>(imageView);
 } 

 @Override
 protected Bitmap doInBackground(String... params) { //实际的下载线程,内部其实是concurrent线程,所以不会阻塞 

   return downloadBitmap(params[0]); 

 } 

 @Override
  protected void onPostExecute(Bitmap bitmap) { //下载完后执行的
  if (isCancelled()) {
   bitmap = null;
  } 

  if (imageViewReference != null) {
   ImageView imageView = imageViewReference.get();
   if (imageView != null) {
    imageView.setImageBitmap(bitmap); //下载完设置imageview为刚才下载的bitmap对象
   }
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2016-09-27

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中使用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编程实现下载图片及在手机中展示的方法

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

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 实现单线程轮循机制批量下载图片

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

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

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

Android中使用AsyncTask实现下载文件动态更新进度条功能

1. 泛型 AysncTask<Params, Progress, Result> Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入. Progress:后台任务执行的进度,若不用显示进度条,则不需要指定. Result:后台任务结束时返回的结果. 2. 重要方法 doInBackground(Params... params):必须重写的方法,后台任务就在这里执行,会开启一个新的线程.params为启动任务时传入的参数,参数个数不定. on

Struts2实现文件上传时显示进度条功能

最近在做一个资源共享的项目中,采用了Struts2.1.8+Spring2.5.6+hibernate3.32的框架整合方式进行开发.在文件上传这块,因为需要实现文件上传时显示进度条的功能,所以尝试了一下.怕以后忘记,先贴出来分享下. 要在上传文件时能显示进度条,首先需要实时的获知web服务端接收了多少字节,以及文件总大小,这里我们在页面上使用AJAX技术每一秒向服务器发送一次请求来获得需要的实时上传信息.但是当我们使用struts2后怎么在服务端获得实时的上传大小呢?这里需要用到commons

C# Winform下载文件并显示进度条的实现代码

方法一: 效果如下图所示: 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WinShowDown { public partial class F

Android自定义View基础开发之图片加载进度条

学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看. 按照惯例,先看效果图,再决定要不要往下看: 既然看到这里了,应该是想了解这个图片加载进度条了,我们先看具体用法,再看自定义View的实现: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.co

android中实现OkHttp下载文件并带进度条

OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作.下面我们用OkHttp来下载文件并带进度条! 相关资料: 官网地址:http://square.github.io/okhttp/ github源码地址:https://github.com/square/okhttp 一.服务器端简单搭建 可以参考搭建本地Tomcat服务器及相关配置这篇文章. 新建项目OkHttpServer,在WebContent目录下新建downloadfile目录

JSP数据分页导出下载显示进度条样式

1.思路 分页数据查询,同时缓存设置进度(为当前取出数据点总数据比例) 2.界面进度条 为 异步请求缓存比例 3.代码 css: body{ position:relative; } .mask{ position:absolute; left:0px; top:0px; height:100%; width:100%; background-color: #eee; display:none; filter:alpha(opacity=50); /*IE滤镜,透明度50%*/ -moz-opa

Core Animation一些Demo总结 (动态切换图片、大转盘、图片折叠、进度条等动画效果)

前一篇总结了Core Animation的一些基础知识,这一篇主要是Core Animation 的一些应用,涉及到CAShapeLayer.CAReplicatorLayer等图层的知识. 先看效果图: 1.切换图片: 2.彩票转盘 3.图片折叠 4.进度条旋转 5.粒子效果 一.切换图片 看起来很复杂的动画,通过少量的计算和编码就可以简单的实现.要做到这一步,必须是需要研究iOS开发中的Core Animation和Core Graphics框架的.日常工作中,对于很多东西不求甚解,只是拿过

Android 仿摩拜单车共享单车进度条实现StepView效果

先看效果图: Step1:定义StepBean 定义五个状态,分别为:为完成.正在进行.已完成.终点完成.终点未完成. public class StepBean{ public static final int STEP_UNDO = -1;//未完成 public static final int STEP_CURRENT = 0;//正在进行 public static final int STEP_COMPLETED = 1;//已完成 public static final int S