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

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。这篇文章给大家介绍Android使用AsyncTask下载图片并显示进度条功能。

AsyncTask下载图片并显示下载进度,异步类AsyncTask配合进度条,简练!

public class AsyncTaskActivity2 extends Activity {
 private Button btnDown;//图片框
 private ImageView ivImage;//图片URL
 private static String image_path = "http://www.wfu.edu.cn/page/main1406/images/nav2.jpg";
 //进度对话框
 private ProgressDialog dialog;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.asynctask_activity);
  btnDown = (Button) findViewById(R.id.btnDown);
  ivImage = (ImageView) findViewById(R.id.ivSinaImage);
  //新建一个对话框,不显示
  dialog = new ProgressDialog(this);
  dialog.setTitle("提示");
  dialog.setMessage("正在下载,请稍后...");
  dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//带有水平滚动条
  dialog.setCancelable(false);//不能
  //单击按钮后执行AsyncTask,并传入图片URL
  btnDown.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    // 执行异步任务
    new MyTask().execute(image_path);//启动AsyncTask,参数类型为异步类的第一个参数的类型
   }
  });
 }
 //创建一个内部类,用来下载图片
 public class MyTask extends AsyncTask<String, Integer, Bitmap> {
  @Override
  protected void onPreExecute() {//启动异步类后首先运行,可以设置
   super.onPreExecute();
   dialog.show();//显示对话框
  }
   //第二步,一般进行复杂处理
  @Override
  protected Bitmap doInBackground(String... params) {//最重要,复杂处理,后台,接收execute传来的参数
   Bitmap bitmap = null; //二进制图片
   //字节数组输出流
   ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
   InputStream inputStream = null;//字节输入流
   try {
    HttpClient httpClient = new DefaultHttpClient();//创建一个Http客户端
    HttpGet httpGet = new HttpGet(params[0]);//发送请求
    HttpResponse httpResponse = httpClient.execute(httpGet);//返回
    if (httpResponse.getStatusLine().getStatusCode() == 200) {//成功
     inputStream = httpResponse.getEntity().getContent();//得到返回内容作为输入流
     long file_length = httpResponse.getEntity().getContentLength();//文件长度
     int len = 0;
     byte[] data = new byte[1024];//每次读取的字节
     int total_length = 0;
     // 以字节的方式读取图片数据
     while ((len = inputStream.read(data)) != -1) {
      total_length += len;
      // 计算进度
      int values = (int) ((total_length / (float) file_length) * 100);
      // 发布进度信息
      publishProgress(values);//发布进度,AsyncTask第二个参数类型,触发onProgressUpdate更新进度条
      outputStream.write(data, 0, len);//写入输出流
     }
     byte[] result=outputStream.toByteArray();//将字节数组输出流转换为字节数组
     //生成二进制图片
     bitmap=BitmapFactory.decodeByteArray(result, 0, result.length);
    }
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    try {
     if (inputStream != null) {
      inputStream.close();
     }
    } catch (Exception e2) {
    }
   }
   return bitmap;
  }
  //当有 publishProgress(value)发来的数据时触发,更新UI
  @Override
  protected void onProgressUpdate(Integer... values) {
   super.onProgressUpdate(values);
   // 设置进度对话框的进度值
   dialog.setProgress(values[0]);//更新进度条,运行在UI
  }
  //第四步
  @Override
  protected void onPostExecute(Bitmap result) {//下载结束后,隐藏对话框
   super.onPostExecute(result);
   dialog.dismiss();
   ivImage.setImageBitmap(result); //更新UI,显示图片,运行在UI
  }
 }
} 

以上所述是小编给大家介绍的Android使用AsyncTask下载图片并显示进度条功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

时间: 2017-02-19

详解Android 中AsyncTask 的使用

详解Android 中AsyncTask 的使用 1.首先我们来看看AsyncTask 的介绍:   Handler 和 AsyncTask 都是android 中用来实现异步任务处理的方式:其中: Handler 实例向 UI 线程发送消息,完成界面更新, 优点:对整个过程控制的比较精细:         缺点:代码相对臃肿,多个任务同时执行时,不易对线程进行精确的控制: AsyncTask :比Handler 更轻量级一些,适用于简单的异步处理: 优点:简单 | 快捷 | 过程可控:    

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

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

Android AsyncTask的优缺点详解

1.Asynctask简介 1.1 使用方法简介 Asynctask作为Android的基础之一,怎么使用就不多讲解了,网上到处都是教程,建议查看Android官方API文档:https://developer.android.google.cn/reference/android/os/AsyncTask.html 这里只实现一个小Demo程序,供大家赏玩: 界面: 这个程序其实特别简单,就是两个按钮,点击分别用来测试AysncTask和Handler两种模式的实现,点击后会有相应的Log提示

Android多线程AsyncTask详解

本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新的线程来执行.默认的情况下,在一个相同Android应用程序当中,其里面的组件都是运行在同一个线程里面的,这个线程我们称之为Main线程.当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的.当然

Android AsyncTask实现异步处理任务的方法详解

Android AsyncTask实现异步处理任务的方法详解 在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行. Android 单线程模型概念详解:http://www.jb51.net/article/112165.htm 在单线程模型中始终要记住两条法则: 不要阻塞UI线程 确保只在UI线程中访问Android UI工具包 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),

Android中使用AsyncTask实现文件下载以及进度更新提示

Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handter即可实现.AsyncTask是抽象类.AsyncTask定义了三种泛型类型Params,Progress和Result: Params启动任务执行的输入参数,比如,HTTP请求的URL. Progress后台任务执行的百分比. Result后台执行任务最终返回的结果,比如String.

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

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

Android AsyncTask详解及使用方法

 Android AsyncTask详解及使用方法  简介: AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务. AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 一.如果想自定义一个AsyncTask,可以写一个类,继承AsyncTask. eg: . //第一个参数为doInBackground中传入的类型,第二个为

Android CardView详解及使用方法和实例

Android  CardView详解 Android5.0中向我们介绍了一个全新的控件–CardView,从本质上看,可以将CardView看做是FrameLayout在自身之上添加了圆角和阴影效果.请注意:CardView被包装为一种布局,并且经常在ListView和RecyclerView的Item布局中,作为一种容器使用. 发现个好看的东东 CardView,他在support v7包中~~ 顾名思义就是卡片view,可以设置阴影,圆角,等等.. 样子是这样的: 或者你还可以放到list

Android CoordinatorLayout详解及实例代码

Android CoordinatorLayout详解 一.CoordinatorLayout有什么作用 CoordinatorLayout作为"super-powered FrameLayout"基本实现两个功能: 1.作为顶层布局 2.调度协调子布局 CoordinatorLayout使用新的思路通过协调调度子布局的形式实现触摸影响布局的形式产生动画效果.CoordinatorLayout通过设置子View的 Behaviors来调度子View.系统(Support V7)提供了A

Android Bitmap详解及Bitmap的内存优化

Android Bitmap详解及Bitmap的内存优化 一.Bitmap: Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件. 常用方法: public void recycle() // 回收位图占用的内存空间,把位图标记为Dead public final boolean isRecycled() //判断位图内存是否已释放 public final int getWidth() //获取位图的

Android ToggleButton 详解及实例代码

Android ToggleButton 详解 在Android的开发过程中,对于ToggleButton的使用频率也是相当的高的,下面我就来说一下,这个组件的两种使用方式. 第一种是简单的使用,利用Toast的方式弹出提示语句 需要注意的是要想自定义ToggleButton的显示的内容,就需要设置其TextOn和TextOff的内容. <ToggleButton android:id="@+id/toggleButton1" android:layout_width="

Android RecyclerView详解之实现 ListView GridView瀑布流效果

 什么是RecyclerView RecyclerView 是Google推出的最新的 替代ListView.GridView的组件,RecyclerView是用来显示大量数据的容器,并通过有限数量的子View,来提高滚动时的性能. 与ListView不同,RecyclerView 不再负责布局,而是专注于布局复用.布局主要通过 LayoutManager来管理,目前提供了3种常用的布局管理: LinearLayoutManager 线性布局管理器 (ListView效果) GridLayout

Android IntentService详解及使用实例

Android IntentService详解 一.IntentService简介 IntentService是Service的子类,比普通的Service增加了额外的功能.先看Service本身存在两个问题: Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中: Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务: 二.IntentService特征 会创建独立的worker线程来处理所有的Intent请求: 会创建独立的wor

mysql 5.7.20解压版安装方法步骤详解(两种方法)

我来讲解下window64位下MySQL的安装,MySQL是在5.7开始安装版就只有32位下载服务了,这里我讲解解压版的MySQL如何安装,在安装MySQL解压版时对于新手的小编来说也是头疼得很,各种问题各种来没有安装版的一键轻松搞定的方便,安装时需要注意三点:1.路径配置,2.安装时MySQL端口被占用这时需要关闭被占用端口,3.cmd必须是在管理员环境下设置MySQL信息. MySQL官网: https://www.mysql.com/downloads/ http://www.jb51.n

详解Struts2动态方法调用

动态方法就是一个Action对应多个请求,减少Action的数量 1.指定method属性 <action name="addAction" method="add" class="com.venn.action.HelloWorldAction"> <result>/jsp/add.jsp</result> </action> 2.感叹号(!)方式(不推荐使用) <action name=&

详解Python import方法引入模块的实例

详解Python import方法引入模块的实例 在Python用import或者from-import或者from-import-as-来导入相应的模块,作用和使用方法与C语言的include头文件类似.其实就是引入某些成熟的函数库和成熟的方法,避免重复造轮子,提高开发速度. python的import方法可以引入系统的模块,也可以引入我们自己写好的共用模块,这点和PHP非常相似,但是它们的具体细节还不是很一样.因为php是在引入的时候指明引入文件的具体路径,而python中不能够写文件路径进