Android AsyncTask 详细解析

结构

继承关系

public abstract class AsyncTask extends Object

java.lang.Object

android.os.AsyncTask<Params, Progress, Result>

类概述

AsyncTask能够适当地、简单地用于 UI线程。 这个类不需要操作线程(Thread)就可以完成后台操作将结果返回UI。

异步任务的定义是一个在后台线程上运行,其结果是在 UI线程上发布的计算。 异步任务被定义成三种泛型类型: Params,Progress和 Result;和四个步骤: begin ,doInBackground,processProgress 和end。

用法

AysncTask必须被继承使用。子类至少覆盖一个方法 (doInBackground(Params...)),最经常覆盖另一个(onPostExecute(Result).)下面是一个子类的例子:

一旦创建,一个任务执行起来就非常简单:

AsyncTask的泛型类型

这三个类型被用于一个异步任务,如下:

1. Params,启动任务执行的输入参数

2. Progress,后台任务执行的百分比

3. Result,后台计算的结果类型

在一个异步任务里,不是所有的类型总被用。假如一个类型不被使用,可以简单地使用 Void类型:

4个步骤

当一个异步任务被执行,任务经过四各步骤:

1.onPreExecute(),在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界面显示一个进度条。

2.doInBackground(Params...),后台线程执行onPreExecute()完后立即调用,这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)来更新任务的进度。

3.onProgressUpdate(Progress...),一次呼叫 publishProgress(Progress...)后调用 UI线程。执行时间是不确定的。这个方法用于当后台计算还在进行时在用户界面显示进度。例如:这个方法可以被用于一个进度条动画或在文本域显示记录。

4.onPostExecute(Result), 当后台计算结束时,调用 UI线程。后台计算结果作为一个参数传递到这步。

线程规则

有一些线程规则必须去遵守,这个类才会正确的工作:

·         任务实例必须创建在 UI线程

·         execute(Params...)必须在 UI线程上调用

·         不要手动调用onPreExecute()onPostExecute(Result)doInBackground(Params...)onProgressUpdate(Progress...)

·         这个任务只执行一次(如果执行第二次将会抛出异常)

内部类

enum       AsyncTask.Status

表示任务的当前状态

构造函数

public AsyncTask ()

创建一个新的异步任务。这个构造函数必须在UI线程上调用。

公共方法

public final boolean cancel (boolean mayInterruptIfRunning)

尝试取消这个任务的执行,如果这个任务已经结束或者已经取消或者不能被取消或者某些其他原因,那么将导致这个操作失败,当调用此方法时,此方法执行成功并且这个任务还没有执行,那么此任务将不再执行。如果任务已经开始,这时执行此操作传入的参数mayInterruptIfRunning为true,执行此任务的线程将尝试中断该任务。

参数

mayInterruptIfRunning  如果为true则正在执行的线程将会中断,如果false,则会允许正在执行的任务线程执行完毕。

返回值

如果此任务不能取消返回false,如果已经正常的执行完毕,返回true

参见

isCancelled()

          onCancelled()

public final AsyncTask<Params, Progress, Result> execute (Params... params)

用指定的参数来执行此任务,这个方法将会返回此任务本身,所以调用者可以拥有此任务的引用。此方法必须在UI线程中调用

参数

params   任务参数

返回值

AsyncTask的实例

异常

IllegalStateException       如果getStatus()返回的是RUNNING或者FINISHED

public final Result get ()

等待计算结束并返回结果

返回值

计算结果

异常

CancellationException    如果计算取消

ExecutionException         如果计算抛出异常

InterruptedException     当等待时当前线程抛出异常

public final Result get (long timeout, TimeUnit unit)

等待计算结束并返回结果,最长等待时间为:timeOut(超时时间).

参数

timeout 计算等待超时时间

unit          超时的时间单位

返回值

计算结果

异常

CancellationException    如果计算取消

ExecutionException         如果计算抛出异常

InterruptedException     当等待时当前线程抛出异常

TimeoutException 等待时间超时

public final AsyncTask.Status getStatus ()

获得任务的当前状态

返回值

当前状态

public final boolean isCancelled ()

如果在任务正常结束之前取消任务成功则返回true,否则返回false

返回值

如果任务正常结束之前取消任务成功返回true。

参见

cancel(boolean)

受保护方法

protected abstract Result doInBackground (Params... params)

覆盖此方法在后台线程执行计算,此方法中的参数是此任务的execute(Params...)方法的调用这传递的参数,此方法可以调用publishProgress(Progress...)UI线程中来更新数据

参数

params   此任务的参数

返回值

返回一个由此任务子类定义的结果 Result

参见

onPreExecute()

onPostExecute(Result)

publishProgress(Progress...)

protected void onCancelled ()

此方法在UI线程中当cancel(boolean) 被调用后调用

参见

cancel(boolean)

isCancelled()

protected void onPostExecute (Result result)

此方法在UI线程中doInBackground(Params...)。方法调用之后调用,此方法中的参数的值是doInBackground(Params...)的返回值或者当此任务已经被取消或有异常发生时此参数值为空null

参数

result      由doInBackground(Params...)计算出的操作的结果。

参见

onPreExecute()

doInBackground(Params...)

protected void onPreExecute ()

在方法doInBackground(Params...)调用之前调用

参见

onPostExecute(Result)

doInBackground(Params...)

protected void onProgressUpdate (Progress... values)

该方法在UI线程中publishProgress(Progress...)被调用之后调用,该方法中的参数values是已经被传递到ppublishProgress(Progress...)中的参数

参数

values     进度表示值

参见

           publishProgress(Progress...)

doInBackground(Params...)

protected final void publishProgress (Progress... values)

当调用doInBackground(Params...)在后台执行计算时会调用该方法,每当在UI线程中调用此方法时将触发onProgressUpdate(Progress...)方法的执行

参数

values     将进度值更新到UI

参见

onProgressUpdate(Progress...)

doInBackground(Params...)

Android AsyncTask 详细解析

时间: 2024-08-08 08:29:05

Android AsyncTask 详细解析的相关文章

[学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解

我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴趣的朋友可以参考 Android Handler.Message完全解析,带你从源码的角度彻底理解 . 不过为了更加方便我们在子线程中更新UI元素,Android从1.5版本就引入了一个AsyncTask类,使用它就可以非常灵活方便地从子线程切换到UI线程,我们本篇文章的主角也就正是它了. Asyn

Android AsyncTask完全解析,带你从源码的角度彻底理解

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11711405 我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴趣的朋友可以参考 Android Handler.Message完全解析,带你从源码的角度彻底理解 . 不过为了更加方便我们在子线程中更新UI元素,Android从1.

(干货) Android Volley框架源码详细解析

前言 经常接触Android网络编程的我们,对于Volley肯定不陌生,但我们不禁要问,对于Volley我们真的很了解吗?Volley的内部是怎样实现的?为什么几行代码就能快速搭建好一个网络请求?我们不但要知其然,也要知其所以然,抱着这样的目的,本文主要详细讲述Volley的源码,对内部流程进行详细解析. Part 1.从RequestQueue说起 (1)还记得搭建请求的第一步是什么吗?是新建一个请求队列,比如说这样: RequestQueue queue = Volley.newReques

异步任务AsyncTask使用解析

在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制.关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下. 为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任

Android Service完全解析,关于服务你所需知道的一切(下) (转载)

转自:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在 上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法.Service和Activity进行通信.Service的销毁方式. Service与Thread的关系.以及如何创建前台Service.以上

Android Service完全解析,关于服务你所需知道的一切(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色.它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持

Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/actionbar.html Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用

Android Service完全解析,关于服务你所需知道的一切(下)

转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法.Service和Activity进行通信.Service的销毁方式.Service与Thread的关系.以及如何创建前台Service.以上所提到的这些知识点,基本上涵盖了大部分日常开发工作当中可能使用到的Service技术.不过关于Service其实还有一个更加

Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示

Android JSON原生解析的几种思路,以天气预报为例 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家还是很有帮助的,老司机要开车了 涉及到网络,你就一定要先添加权限,准没错 <!--网络权限--> <uses-permission android:name="android.permission.INTERNET" /> 一.归属地查询(JSONObject) 这个也是最简单的一类Json