Android中的异步任务――AsyncTask 分类: Android Activity 2014-07-04 09:14 74人阅读 评论(0) 收藏
2014-07-04 09:14
411 查看
http://www.th7.cn/Program/java/201209/89514.shtml
android一个程序(apk)是一个进程,在程序启动时,系统启动一进程,该进程启动一个主线(UI线程),在UI线程中进行UI组件的加载和与用户交互(对用户的请求作出应答),倘若在UI线程中进行一些比较耗时的工作如:读取sd卡文件中的数据或访问数据库中的数据或者访问网络等,会造成ANR现象。所以为了提升用户体验,让自己的软件的流畅度更高一些,在UI线程中不要进行一些耗时的操作。那么这些操作应该怎么办呢?现在就像大家介绍一下android中的异步任务。
1.首先什么是异步任务?android的异步任务也可以称作后台任务,是在UI线程外启动一个线程执行耗时的任务,比用户新建线程(主次线程之间通过Handler进行通信)的好处是它可以不通过Handler通信,在任务的一个方法中直接对UI线程中的组件进行操作,他还有一个好处是可以随时获取到任务的执行进度,这对于下载和上传等操作很方便。
2.Android.os.AsyncTask类:
①android的类AsyncTask对线程间通讯进行了包装,提供了简易的编程方式来使后台线程和UI线程进行通讯:后台线程执行异步任务,并把操作结果通知UI线程。
②AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String,Integer等。
这三个参数都是泛型,当然也可以自定义了。
③AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现这些方法。
a.onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
b.doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。此处注意将执行后得到的结果返回,还有注意此处的参数是可变参数。(可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。)
c.onProgressUpdate(Progress...),此方法是随着任务进行进度不停的进行调用。在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
d.onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.
e.onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。
3.为了正确的使用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传入的参数。
android一个程序(apk)是一个进程,在程序启动时,系统启动一进程,该进程启动一个主线(UI线程),在UI线程中进行UI组件的加载和与用户交互(对用户的请求作出应答),倘若在UI线程中进行一些比较耗时的工作如:读取sd卡文件中的数据或访问数据库中的数据或者访问网络等,会造成ANR现象。所以为了提升用户体验,让自己的软件的流畅度更高一些,在UI线程中不要进行一些耗时的操作。那么这些操作应该怎么办呢?现在就像大家介绍一下android中的异步任务。
1.首先什么是异步任务?android的异步任务也可以称作后台任务,是在UI线程外启动一个线程执行耗时的任务,比用户新建线程(主次线程之间通过Handler进行通信)的好处是它可以不通过Handler通信,在任务的一个方法中直接对UI线程中的组件进行操作,他还有一个好处是可以随时获取到任务的执行进度,这对于下载和上传等操作很方便。
2.Android.os.AsyncTask类:
①android的类AsyncTask对线程间通讯进行了包装,提供了简易的编程方式来使后台线程和UI线程进行通讯:后台线程执行异步任务,并把操作结果通知UI线程。
②AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String,Integer等。
这三个参数都是泛型,当然也可以自定义了。
③AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现这些方法。
a.onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
b.doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。此处注意将执行后得到的结果返回,还有注意此处的参数是可变参数。(可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。)
c.onProgressUpdate(Progress...),此方法是随着任务进行进度不停的进行调用。在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
d.onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.
e.onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。
3.为了正确的使用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传入的参数。
相关文章推荐
- Android中AsyncTask的简单用法 分类: Android Activity 2014-07-04 09:21 56人阅读 评论(0) 收藏
- android异步任务详解 AsynTask 分类: Android Activity 2014-07-03 07:20 98人阅读 评论(0) 收藏
- 多线程异步处理:AsyncTask异步更新UI界面 android开发教程 分类: Android Activity 2014-07-10 14:13 112人阅读 评论(0) 收藏
- Java 遍历Map时 删除元素ZZ 分类: Android资源 2014-05-30 10:59 74人阅读 评论(0) 收藏
- [转]Android开发中常用工具类总结-… 分类: Android开发 2014-05-30 10:54 74人阅读 评论(0) 收藏
- import android.R 导致drawable下的图片找不到cannot be resolved or is not a field 分类: Android安装及配置 2015-01-07 12:08 74人阅读 评论(0) 收藏
- android工程搅混和反编译ZZ 分类: Android开发 Android安装及配置 2014-05-30 10:56 74人阅读 评论(0) 收藏
- 通过Handler与线程嵌套TimerTask实现循环交替任务 分类: Android 2015-07-24 16:14 162人阅读 评论(0) 收藏
- Android模拟器无法上网解决方案&nb… 分类: Android安装及配置 2014-05-30 10:58 74人阅读 评论(0) 收藏
- android 如何把一个 RelativeLayout或ImageView背景设为透明 分类: Android多媒体 2015-01-18 10:37 74人阅读 评论(0) 收藏
- 如何解决安卓SDK无法下载Package的问题 分类: H1_ANDROID 2013-09-09 10:26 1199人阅读 评论(0) 收藏
- 菜单之一:Menu基础内容 分类: H1_ANDROID 2013-11-03 00:23 906人阅读 评论(0) 收藏
- TextView之二:常用属性 分类: H1_ANDROID 2013-10-30 12:43 3203人阅读 评论(0) 收藏
- 使用SQLiteHelper创建数据库并插入数据 分类: H1_ANDROID 2013-11-05 22:44 1398人阅读 评论(0) 收藏
- Intent七在属性之一:ComponentName 分类: H1_ANDROID 2013-11-10 10:54 1184人阅读 评论(1) 收藏
- Android中对手机文件进行读写 分类: H1_ANDROID 2013-10-23 22:48 512人阅读 评论(0) 收藏
- TextView之一:子类的常用属性 分类: H1_ANDROID 2013-10-30 15:14 770人阅读 评论(0) 收藏
- 自定义view组件 分类: H1_ANDROID 2013-10-26 21:55 741人阅读 评论(0) 收藏
- SharedPreferences基础 分类: H1_ANDROID 2013-11-04 22:35 2559人阅读 评论(0) 收藏
- 【转载】Ubuntu Android开发环境搭配 分类: arm-linux-Ubuntu 2013-07-22 16:31 318人阅读 评论(0) 收藏