在Android应用中利用异步任务实现一个进度条下载功能

  介绍

在Android应用中利用异步任务实现一个进度条下载功能吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强>为什么要用异步任务?

在Android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作

Android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作,比如一些耗时操作。如果放在主线程中会造成阻塞而当阻塞事件过长时系统会抛出anr异常,所以我们要使用异步任务.android为我们提供了一个封装好的组件asynctask。

asynctask可以在子线程中更新ui,封装简化了异步操作。适用于简单的异步处理。如果多个后台任务时就要使用处理了在这里就不再说明。

asynctask通常用于被继承.AsyncTask定义了三种泛型类型& lt; Params,进步,Result>

    <李>参数:启动任务时输入的参数类型 <李>进步:后台任务执行的百分比李 <李>结果:执行任务完成后返回结果的类型

<强>继承asynctask后要重写的方法有:

必须重写,异步执行后台线程要完成的任务,耗时任务要写在这里,并且在这里不能操作ui。可以调用publishProgress方法来更新实时的任务进度

执行耗时操作前调用,可以完成一些初始化操作

在doInBackground执行完成后,主线程调用此方法,可以在此方法中操作ui

在doInBackgroud方法中调用publishProgress方法,更新任务的执行进度后就会调用这个方法

下面通过一个实例来了解asynctask

首先附上运行结果

在Android应用中利用异步任务实现一个进度条下载功能

<强>布局文件:

& lt; LinearLayout xmlns: Android=癶ttp://schemas.android.com/apk/res/android"   xmlns:工具=癶ttp://schemas.android.com/tools"   android: layout_width=癿atch_parent"   android: layout_height=癿atch_parent"   android:取向=皏ertical"比;      & lt;按钮   android: id=癅 + id/btn_download"   android: layout_width=皐rap_content"   android: layout_height=皐rap_content"   android: layout_gravity=癱enter_horizontal"   android:文本=暗慊飨略亍?/比;      & lt; FrameLayout   android: layout_width=癴ill_parent"   android: layout_height=癴ill_parent"比;      & lt; ImageView   android: id=癅 + id/iv_image"   android: layout_width=癴ill_parent"   android: layout_height=癴ill_parent"   android: scaleType=癴itCenter"/比;      & lt;/FrameLayout>   & lt;/LinearLayout>   

<强> MainActivity

包com.example.asynctask;
  进口java.io.BufferedInputStream;
  进口java.io.ByteArrayOutputStream;
  进口java.io.IOException;
  进口java.io.InputStream;
  进口java.net.MalformedURLException;
  进口java.net.URLConnection;
  进口android.os.AsyncTask;
  进口android.os.Bundle;
  进口android.app.Activity;
  进口android.app.ProgressDialog;
  进口android.graphics.Bitmap;
  进口android.graphics.BitmapFactory;
  进口android.view.View;
  进口android.view.View.OnClickListener;
  进口android.widget.Button;
  进口android.widget.ImageView;
  公共类MainActivity扩展活动实现OnClickListener {
  私人ImageView形象;
  私人ProgressDialog进步;
  私人按钮btn_download;
  私有静态字符串URL=? http://img4.imgtn.bdimg.com/it/u=1256159061, 743487979, fm=21, gp=0. jpg";
  @Override
  保护无效onCreate(包savedInstanceState) {
  super.onCreate (savedInstanceState);
  setContentView (R.layout.activity_main);
  形象=(ImageView) findViewById (R.id.iv_image);
  btn_download=(按钮)findViewById (R.id.btn_download);
  进步=new ProgressDialog(这个);
  progress.setIcon (R.drawable.ic_launcher);
  progress.setTitle(“提示信息“);
  progress.setMessage(“正在下载,请稍候…“);
  progress.setProgressStyle (ProgressDialog.STYLE_HORIZONTAL);
  btn_download.setOnClickListener(这个);
  }
  @Override
  公共空间onClick(查看v) {//TODO自动生成方法存根
  新的MyAsyncTask () . execute (URL);
  }/*
  字符串* * * * * * * * * *对应我们的URL类型
  *整数* * * * * * * *进度条的进度值
  *位图* * * * * * * * *异步任务完成后返回的类型
  * */类MyAsyncTask AsyncTask<延伸;字符串,整数,Bitmap> {//执行异步任务(doInBackground)之前执行,并且在ui线程中执行
  @Override
  保护无效onPreExecute () {//TODO自动生成方法存根
  super.onPreExecute ();
  如果(形象!=null) {
  image.setVisibility (View.GONE);
  }//开始下载对话框进度条显示
  progress.show ();
  progress.setProgress (0);
  }
  @Override
  保护位图doInBackground(字符串…params) {//TODO自动生成方法存根//参数是一个可变长的数组在这里我们只传进来了一个url
  字符串url=params [0];
  位图的位图=零;
  URLConnection连接;
  InputStream;//用于获取数据的输入流
  ByteArrayOutputStream bos;//可以捕获内存缓冲区的数据,转换成字节数组。
  int len;
  浮动数=0,总;//计数为图片已经下载的大小总为总大小
  尝试{//获取网络连接对象
  连接=(URLConnection)新java.net.URL (url) .openConnection ();//获取当前页面的总长度
  总=(int) connection.getContentLength ();//获取输入流
  是=connection.getInputStream ();
  bos=new ByteArrayOutputStream ();
  byte [] data=https://www.yisu.com/zixun/new字节[1024];
  而((len=is.read(数据)!=1){
  数+=兰;
  bos.write(数据、0 len);//调用publishProgress公布进度,最后onProgressUpdate方法将被执行
  publishProgress ((int)(数/总* 100));//为了显示出进度人为休眠0.5秒
  thread . sleep (500);
  }
  位图=BitmapFactory.decodeByteArray (bos.toByteArray (), 0, bos.toByteArray () . length);
  is.close ();
  bos.close ();
  }捕捉(MalformedURLException e) {//TODO自动生成的catch块
  e.printStackTrace ();
  }捕捉(IOException e) {//TODO自动生成的catch块
  e.printStackTrace ();
  }捕捉(InterruptedException e) {//TODO自动生成的catch块
  e.printStackTrace ();
  }
  返回位图;
  }//在ui线程中执行可以操作ui
  @Override
  保护无效onPostExecute(位图的位图){
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

在Android应用中利用异步任务实现一个进度条下载功能