Android异步消息处理机制(3)AsyncTask基本使用
2015-08-25 23:29
176 查看
本文翻译自android官方文档,结合自己测试,整理如下。
虽然AsyncTask可以提供后台运行并将结果显示在UI上,但是理想情况应该是后台操作最多只能是几秒钟,若要执行长时间的操作强烈建议使用java中的
AsyncTask直接继承Object类,位于android.os.AsyncTask。一个AsyncTask实现类接收三个泛型参数:Params,Progress和Result,需要四步完成:
Params
可用于在后台任务中使用。
Progress
后台任务执行的进度。
Result
任务执行的结果。
若不用以上参数的话,可以指定为Void类,例如:
该方法会在后台任务开始之前被调用,通常在这里可以完成一些界面初始化工作。
在
当在
当
AsyncTask类必须在UI线程中加载,这个该步骤作为
实例必须在UI线程中创建。
必须在UI线程中调用
不要手动调用
任务只能被执行一次,若执行第二次的话将会抛出异常。
在构造器或
在
概述
AsyncTask抽象类,翻译过来就是异步任务,能够合理并方便的使用UI线程。该类可以实现将后台操作结果显示在UI线程中,而不需要我们自己实现子线程或者handler(当然它内部也是借助这两者实现的)。虽然AsyncTask可以提供后台运行并将结果显示在UI上,但是理想情况应该是后台操作最多只能是几秒钟,若要执行长时间的操作强烈建议使用java中的
Executor,ThreadPoolExecutor,FutureTask等。
AsyncTask直接继承Object类,位于android.os.AsyncTask。一个AsyncTask实现类接收三个泛型参数:Params,Progress和Result,需要四步完成:
onPreExecute(),
doInBackground(),
onProgressUpdate(),
onPostExecute()。
基本用法
通过继承AsyncTask类实现自己的异步任务。泛型参数
AsyncTask接收三个泛型参数分别为:Params
可用于在后台任务中使用。
Progress
后台任务执行的进度。
Result
任务执行的结果。
若不用以上参数的话,可以指定为Void类,例如:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
四个方法
若要执行异步任务通常需要实现以下四个方法:onPreExecute()
该方法会在后台任务开始之前被调用,通常在这里可以完成一些界面初始化工作。doInBackground()
在onPreExecute()执行完之后就会调用该方法,此时进入到后台任务(子线程中,因此不能更新UI操作)。若AsyncTask类中的第三个参数不是Void类的话,则该方法需要返回第三个泛型参数类型值。若想显示任务进度的话可以在该方法中调用
publishProgress()方法将进度传递给
onProgressUpdate()。
onProgressUpdate()
当在doInBackground()中调用
publishProgress()方法后,该方法就会在UI线程中被调用,可以用于更新UI。该方法可以在后台任务执行的同时更新UI。
onPostExecute()
当doInBackground()执行完成后,且第三个泛型参数不是Void时,就会在UI线程中调用该方法。后台任务执行结果将以参数的形式传递进来,因此可以在这里执行任务完成后的操作。
终止任务
在后台任务执行时可以通过调用cancel()方法来终止该任务。调用该方法之后,在
doInBackground()执行后将调用
onCancelled(),而不再会调用
onPostExecute()。为了尽可能快的将任务结束,我们应该在
doInBackground()中总是时刻检查isCancelled()`的返回值(例如可以使用循环检查)。
线程规则
为了让该类能合理的执行,以下规则需要注意一下:AsyncTask类必须在UI线程中加载,这个该步骤作为
JELLY_BEAN自动完成。
实例必须在UI线程中创建。
必须在UI线程中调用
execute()。
不要手动调用
onPreExecute(),
doInBackground(),
onProgressUpdate(),
onPostExecute()。
任务只能被执行一次,若执行第二次的话将会抛出异常。
内存可观察性(Memory observability)
按照下列方法,AsynTask保证所有回调方法调用不用加synchronized也是线程安全的:在构造器或
onPreExecute()设置成员变量,在
doInBaclground()引用。
在
doInBaclground()设置成员变量,在
onProgressUpdate()和
onPostExecute()引用。
执行顺序
这一部分将在源码分析中介绍请参考:Android异步消息处理机制(4)AsyncTask源码解析相关文章推荐
- Android硬件抽象层(HAL)模块编写规范
- 第一个android和php的案例开始
- android 自定义图表学习集合
- 非Root权限的Android上运行可执行文件
- Android相关
- Android编译过程
- onfoq的android周报
- Android一个小球弹跳的例子,希望对大家有用
- Android游戏开发之数独课时----4
- Android应用开发之所有动画使用详解
- Android第四夜
- gradle在android studio中应用入门
- android相对布局
- 初学Android的一些注意事项
- Android中图像变换Matrix的原理、代码验证和应用(二)
- Android Universal Image Loader 学习笔记(一)
- Android 存储:SD卡剩余空间的检测
- Android Studio Debug
- Android下多个Activity 使用同一个SlidingMenu
- android WIFI 调试