全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

为什么要用异步任务?

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

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

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

AsyncTask通常用于被继承。AsyncTask定义了三种泛型类型<Params,Progress,Result>

  • Params:启动任务时输入的参数类型
  • Progress:后台任务执行的百分比
  • Result:执行任务完成后返回结果的类型

继承AsyncTask后要重写的方法有:

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

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

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

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

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

首先附上运行结果

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 xmlns:tools="http://schemas.android.com/tools" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:orientation="vertical" > 

 <Button 
  android:id="@+id/btn_download" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:layout_gravity="center_horizontal" 
  android:text="点击下载" /> 

 <FrameLayout 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" > 

  <ImageView 
   android:id="@+id/iv_image" 
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:scaleType="fitCenter" /> 

 </FrameLayout> 
</LinearLayout> 

MainActivity

package com.example.asynctask; 
import java.io.BufferedInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URLConnection; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
public class MainActivity extends Activity implements OnClickListener{ 
 private ImageView image; 
 private ProgressDialog progress; 
 private Button btn_download; 
 private static String URL="http://img4.imgtn.bdimg.com/it/u=1256159061,743487979&fm=21&gp=0.jpg"; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  image=(ImageView) findViewById(R.id.iv_image); 
  btn_download=(Button) findViewById(R.id.btn_download); 
  progress=new ProgressDialog(this); 
  progress.setIcon(R.drawable.ic_launcher); 
  progress.setTitle("提示信息"); 
  progress.setMessage("正在下载,请稍候..."); 
  progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
  btn_download.setOnClickListener(this); 
 } 
 @Override 
 public void onClick(View v) { 
  // TODO Auto-generated method stub 
  new MyAsyncTask().execute(URL); 
 } 
 /* 
  * String*********对应我们的URL类型 
  * Integer********进度条的进度值 
  * BitMap*********异步任务完成后返回的类型 
  * */ 
 class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>{ 

  //执行异步任务(doInBackground)之前执行,并且在ui线程中执行 
  @Override 
  protected void onPreExecute() { 
   // TODO Auto-generated method stub 
   super.onPreExecute(); 
   if(image!=null){ 
    image.setVisibility(View.GONE); 
   } 
   //开始下载 对话框进度条显示 
   progress.show(); 
   progress.setProgress(0); 
  } 
  @Override 
  protected Bitmap doInBackground(String... params) { 
   // TODO Auto-generated method stub 
   //params是一个可变长的数组 在这里我们只传进来了一个url 
   String url=params[0]; 
   Bitmap bitmap=null; 
   URLConnection connection; 
   InputStream is;//用于获取数据的输入流 
   ByteArrayOutputStream bos;//可以捕获内存缓冲区的数据,转换成字节数组。 
   int len; 
   float count=0,total;//count为图片已经下载的大小 total为总大小 
   try { 
    //获取网络连接对象 
    connection=(URLConnection) new java.net.URL(url).openConnection(); 
    //获取当前页面的总长度 
    total=(int)connection.getContentLength(); 
    //获取输入流 
    is=connection.getInputStream(); 
    bos=new ByteArrayOutputStream(); 
    byte []data=new byte[1024]; 
    while((len=is.read(data))!=-1){ 
     count+=len; 
     bos.write(data,0,len); 
     //调用publishProgress公布进度,最后onProgressUpdate方法将被执行 
     publishProgress((int)(count/total*100)); 
     //为了显示出进度 人为休眠0.5秒 
     Thread.sleep(500); 
    } 
    bitmap=BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.toByteArray().length); 
    is.close(); 
    bos.close(); 
   } catch (MalformedURLException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
   return bitmap; 
  } 
  //在ui线程中执行 可以操作ui 
  @Override 
  protected void onPostExecute(Bitmap bitmap) { 
   // TODO Auto-generated method stub 
   super.onPostExecute(bitmap); 
   //下载完成 对话框进度条隐藏 
   progress.cancel(); 
   image.setImageBitmap(bitmap); 
   image.setVisibility(View.VISIBLE); 
  } 
  /* 
   * 在doInBackground方法中已经调用publishProgress方法 更新任务的执行进度后 
   * 调用这个方法 实现进度条的更新 
   * */ 
  @Override 
  protected void onProgressUpdate(Integer... values) { 
   // TODO Auto-generated method stub 
   super.onProgressUpdate(values); 
   progress.setProgress(values[0]); 
  } 
 } 
} 

最后不要忘记在AndroidManifest文件中配置网络访问权限

<uses-permission android:name="android.permission.INTERNET"/> 

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# asynctask  # 进度条  # asynctask异步任务  # 异步asynctask  # Android-AnsyncTask异步任务的使用  # Android 异步任务 设置 超时使用handler更新通知功能  # Android AsyncTack 异步任务实例详解  # Android消息机制Handler用法总结  # 详解Android 消息处理机制  # Android编程实现异步消息处理机制的几种方法总结  # Android 异步任务和消息机制面试题分析  # 在这里  # 是一个  # 放在  # 重写  # 完成后  # 对话框  # 要使  # 就会  # 多个  # 在此  # 适用于  # 提示信息  # 要用  # 三种  # 将被  # 点击下载  # 时就  # 能把  # 请稍候 


相关文章: 建站主机选购指南:核心配置优化与品牌推荐方案  建站上市公司网站建设方案与SEO优化服务定制指南  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  简单实现Android文件上传  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  c++怎么用jemalloc c++替换默认内存分配器【性能】  高性能网站服务器配置指南:安全稳定与高效建站核心方案  如何彻底删除建站之星生成的Banner?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  教学网站制作软件,学习*后期制作的网站有哪些?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  代刷网站制作软件,别人代刷火车票靠谱吗?  宁波自助建站系统如何快速打造专业企业网站?  创业网站制作流程,创业网站可靠吗?  如何规划企业建站流程的关键步骤?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  建站之星安装后如何自定义网站颜色与字体?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  建站之星如何防范黑客攻击与数据泄露?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  制作企业网站建设方案,怎样建设一个公司网站?  如何在云指建站中生成FTP站点?  h5网站制作工具有哪些,h5页面制作工具有哪些?  济南网站制作的价格,历城一职专官方网站?  测试制作网站有哪些,测试性取向的权威测试或者网站?  如何通过可视化优化提升建站效果?  c# 在高并发场景下,委托和接口调用的性能对比  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  如何快速查询网址的建站时间与历史轨迹?  建站主机如何安装配置?新手必看操作指南  宝塔Windows建站如何避免显示默认IIS页面?  c++ stringstream用法详解_c++字符串与数字转换利器  已有域名如何快速搭建专属网站?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  高端企业智能建站程序:SEO优化与响应式模板定制开发  怎么将XML数据可视化 D3.js加载XML  如何用腾讯建站主机快速创建免费网站?  香港服务器部署网站为何提示未备案?  网站微信制作软件,如何制作微信链接?  北京企业网站设计制作公司,北京铁路集团官方网站?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Thinkphp 中 distinct 的用法解析  如何在云主机上快速搭建网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。