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下载图片并显示进度条功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android AsyncTask详解及使用方法

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

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

  • Android多线程AsyncTask详解

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

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

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

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

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

  • Android 下载文件通知栏显示进度条功能的实例代码

    1.使用AsyncTask异步任务实现,调用publishProgress()方法刷新进度来实现(已优化) public class MyAsyncTask extends AsyncTask<String,Integer,Integer> { private Context context; private NotificationManager notificationManager; private NotificationCompat.Builder builder; public M

  • python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能

    1.代码1: (1)进度条等显示在主窗口状态栏的右端,代码如下: from PyQt5.QtWidgets import QMainWindow, QProgressBar, QApplication, QLabel import sys class SampleBar(QMainWindow): """Main Application""" def __init__(self, parent = None): print('Starting t

  • Python使用progressbar模块实现的显示进度条功能

    本文实例讲述了Python使用progressbar模块实现的显示进度条功能.分享给大家供大家参考,具体如下: progressbar安装: pip install progressbar 用法一 # -*- coding=utf-8 -*- import time from progressbar import * total = 1000 def dosomework(): time.sleep(0.01) progress = ProgressBar() for i in progress

  • Vue项目页面跳转时浏览器窗口上方显示进度条功能

    在vue项目中,为了减少首屏加载的时间,通常会开启路由的懒加载.路由懒加载配合gizp确实能帮助我们大大的加快首屏的加载时间. 然而,路由懒加载会使得我们在第一次打开一个新页面的时候,会有一个加载时间.如果在这个时候我们没有一个提示的话,给人的感觉会是好像我点了页面跳转但是没反应.所以,这个时候我们可以加一个进度条来告知用户. 具体实现,我们使用NProgress这个滚动条效果插件. 1.安装: cnpm install --save nprogress 2.在main.js中引入: impor

  • 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编程实现显示在标题上的进度条功能【附源码下载】

    本文实例讲述了Android编程实现显示在标题上的进度条功能.分享给大家供大家参考,具体如下: 今天我们来学习一下Android中显示在Activity标题上的进度条.在这个例子当中我们还能够学习到很多关于AsyncTask的知识. (1)准备用于显示到界面上的四张图片img01,img02,img03,img04 (2)在Activity的布局文件activity_main.xml中只定义一个线性布局LinearLayout,并为其设置一个id,代码如下: <LinearLayout xmln

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

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

随机推荐