(图)
          在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验。但是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现错误。因此android提供了一个类Handler来在子线程中来更新UI线程,用发消息的机制更新UI界面,呈现给用户。这样就解决了子线程更新UI的问题。但是费时的任务操作总会启动一些匿名的子线程,太多的子线程给系统带来巨大的负担,随之带来一些性能问题。因此android提供了一个工具类AsyncTask,顾名思义异步执行任务。这个AsyncTask生来就是处理一些后台的比较耗时的任务,给用户带来良好用户体验的,从编程的语法上显得优雅了许多,不再需要子线程和Handler就可以完成异步操作并且刷新用户界面。

先大概认识下Android.os.AsyncTask类:

* android的类AsyncTask对线程间通讯进行了包装,提供了简易的编程方式来使后台线程和UI线程进行通讯:后台线程执行异步任务,并把操作结果通知UI线程。

* AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
   * Params 启动任务执行的输入参数,比如HTTP请求的URL。
   * Progress 后台任务执行的百分比。
    * Result 后台执行任务最终返回的结果,比如String,Integer等。

* AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现这些方法。

   * 1) 继承AsyncTask
    * 2) 实现AsyncTask中定义的下面一个或几个方法
       * onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
       * doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
      * onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
      * onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.

* onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。

为了正确的使用AsyncTask类,以下是几条必须遵守的准则:

  1) Task的实例必须在UI 线程中创建

  2) execute方法必须在UI 线程中调用

  3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。

  4) 该task只能被执行一次,否则多次调用时将会出现异常

doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。

下面通过一个Demo来说明如何使用Android.os.AsyncTask类,通过进度条来显示进行的进度,然后用TextView来显示进度值。程序结构图如下:

[1] \layout\main.xml 布局文件源码如下:

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="Hello , Welcome to Andy's Blog!"/>
  11. <Button
  12. android:id="@+id/download"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:text="Download"/>
  16. <TextView
  17. android:id="@+id/tv"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:text="当前进度显示"/>
  21. <ProgressBar
  22. android:id="@+id/pb"
  23. android:layout_width="fill_parent"
  24. android:layout_height="wrap_content"
  25. style="?android:attr/progressBarStyleHorizontal"/>
  26. </LinearLayout>

[2] /src中的MainActivity.java源码如下:

[html] view plaincopy
  1. package com.andyidea.demo;
  2. import android.app.Activity;
  3. import android.os.AsyncTask;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.ProgressBar;
  8. import android.widget.TextView;
  9. public class MainActivity extends Activity {
  10. Button download;
  11. ProgressBar pb;
  12. TextView tv;
  13. /** Called when the activity is first created. */
  14. @Override
  15. public void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. pb=(ProgressBar)findViewById(R.id.pb);
  19. tv=(TextView)findViewById(R.id.tv);
  20. download = (Button)findViewById(R.id.download);
  21. download.setOnClickListener(new View.OnClickListener() {
  22. @Override
  23. public void onClick(View v) {
  24. DownloadTask dTask = new DownloadTask();
  25. dTask.execute(100);
  26. }
  27. });
  28. }
  29. class DownloadTask extends AsyncTask<Integer, Integer, String>{
  30. //后面尖括号内分别是参数(例子里是线程休息时间),进度(publishProgress用到),返回值 类型
  31. @Override
  32. protected void onPreExecute() {
  33. //第一个执行方法
  34. super.onPreExecute();
  35. }
  36. @Override
  37. protected String doInBackground(Integer... params) {
  38. //第二个执行方法,onPreExecute()执行完后执行
  39. for(int i=0;i<=100;i++){
  40. pb.setProgress(i);
  41. publishProgress(i);
  42. try {
  43. Thread.sleep(params[0]);
  44. } catch (InterruptedException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. return "执行完毕";
  49. }
  50. @Override
  51. protected void onProgressUpdate(Integer... progress) {
  52. //这个函数在doInBackground调用publishProgress时触发,虽然调用时只有一个参数
  53. //但是这里取到的是一个数组,所以要用progesss[0]来取值
  54. //第n个参数就用progress[n]来取值
  55. tv.setText(progress[0]+"%");
  56. super.onProgressUpdate(progress);
  57. }
  58. @Override
  59. protected void onPostExecute(String result) {
  60. //doInBackground返回时触发,换句话说,就是doInBackground执行完后触发
  61. //这里的result就是上面doInBackground执行后的返回值,所以这里是"执行完毕"
  62. setTitle(result);
  63. super.onPostExecute(result);
  64. }
  65. }
  66. }

[3] 下面看下程序的运行结果截图:

转载于:https://www.cnblogs.com/wuwuwu/archive/2013/06/14/6162743.html

Android AsyncTask异步线程相关推荐

  1. 使用Android AsyncTask异步线程

    本文地址:http://blog.csdn.net/csheng1204/article/details/7233863 转载请注明,谢谢~ 首先声明一下,本人是一个只学了几个月Android的新手, ...

  2. android asynctask异步处理抓取网页,Android处理异步耗时任务,AsyncTask使用教程

    原文链接:http://www.jufanshare.com/content/124.html 本教程附Demo:https://gitee.com/qwertiddler/AsyncTask.git ...

  3. android task详解,Android AsyncTask的使用详解

    当然,我们在进行耗时操作或者更新UI时,是可以使用匿名线程的,但是此种方式是存在缺陷的:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用 程序的效率要低很多:第二,线程无法管理,匿名线程创 ...

  4. Android 消息异步处理之AsyncTask

    Android提供了异步处理消息的方式大致有两种,第一种是handler+Thread,之前已经对于这种方式做过分析,第二种就是AsyncTask,这是Android1.5提供的一种轻量级的工具类,其 ...

  5. Android开发--AsyncTask异步任务(二)

    一.什么是异步操作 异步操作是指把消耗时间的操作放在另一个线程内执行,变成两个线程独立并行执行的状态.通常涉及网络的操作大多数放在异步任务中. 二.异步任务AsyncTask 1.建立异步任务 pub ...

  6. 【Android 异步操作】AsyncTask 异步任务 ( FutureTask 模拟 AsyncTask 执行过程 | AsyncTask 执行过程回顾 | FutureTask 分析 )

    文章目录 一.FutureTask 使用流程 二.FutureTask 模拟 AsyncTask 执行过程 三.AsyncTask 执行过程回顾 四.FutureTask 分析 一.FutureTas ...

  7. 【Android 异步操作】AsyncTask 异步任务 ( AsyncTask 异步任务执行方法 execute 方法相关源码解析 )

    文章目录 一.AsyncTask 异步任务执行方法 execute() 引入 二.AsyncTask 异步任务执行方法 execute() 三.sDefaultExecutor 线程池解析 四.exe ...

  8. 【Android 异步操作】AsyncTask 异步任务 ( 参数简介 | 方法简介 | 使用方法 | AsyncTask 源码分析 )

    文章目录 一.AsyncTask 参数简介 二.AsyncTask 方法简介 三.AsyncTask 基本用法 四.AsyncTask 构造函数源码解析 五.AsyncTask 构造函数相关源码注释 ...

  9. Android异步处理二:AsynTask介绍和使用AsyncTask异步更新UI界面

    做一下如何同构AsyncTask异步任务来更新UI界面. (1)AsyncTask的介绍 通过上图中的AsyncTask的源码结构图可以看到,主要用于重载的方法是doInBackground(),on ...

最新文章

  1. 神经网络基础知识梳理
  2. 安卓连接mysql客户端_安卓客户端与mysql服务器端数据交互
  3. Lucene学习笔记:Field.Store.* 域存储选项
  4. basename函数使用
  5. HashSet存储自定义类型元素
  6. 03 - const static extern
  7. 天池 在线编程 LR String
  8. dp线和hdmi区别_HDMI铜线与光纤线有啥区别?为什么铜线传播速度更快?看完涨知识...
  9. matlab 矢量化编程(四)—— 标量函数转化为能够处理矢量的函数
  10. Chain of Responsibility(职责链模式)
  11. 面向对象---特----性
  12. div在html中的好处,详解DIV+CSS布局的好处和意义
  13. javascript 操作服务器 文件,使用javascript读取服务器文件
  14. 登录时记住密码的实现
  15. 已知两点和弧长lisp_CAD插件——已知两点和弧长如何画圆弧?
  16. mysql和虚拟主机区别_虚拟主机mysql
  17. 带你实战Android深色模式,深入原理剖析
  18. (由Active Desktop保存在桌面引起)桌面图标蓝底
  19. 苹果手机使用技巧篇:教你完美使用好苹果手机的4个方法
  20. 配置 CRM2011 IFD

热门文章

  1. php fpm core,在php-fpm下,服务器间歇出现core dump 追踪到php代码是include一个php文件...
  2. springboot的一些基层原理 2021-05-28
  3. ar开发 ue4_UE4 和 ARKit 入门
  4. wifi频率和zigbee干扰_浅谈ZigBee和Wi—Fi的共存和干扰
  5. ibatis java配置文件,ibatis学习-sqlMap.xml配置文件 | 学步园
  6. anki 新的卡片类型_用 Anki 建立高效复习错题体系
  7. 修改文章更新缓存php,php – 使用liipImagineBundle更新/删除记录时删除/更新缓存的图像...
  8. php序列化函数输入0存不了,php序列化函数的区别
  9. linux内存测试工具memtest,Linux-内存检测利器Memtest86+v1.70
  10. 纵坐标范围_探索频率范围与频响的奥秘