Android中我们可以通过Theater+Handler来实现多线程通信,当子线程的耗时任务完成后通过Handler向主线程发送message,主线程收到message后开始更新UI,而为了使代码更加统一,我们会使用AsyncTask类。
- 什么是AsyncTask
- AsyncTask怎么用
- 需要实现的几个方法、这些方法有什么用
- 泛型参数
- 长度可变的泛式参数
- 案例–倒计时Demo
什么是AsyncTask
- AsyncTask是Android提供的轻量级异步类。
- 为了降低异步通信的开发难度,提供了AsyncTask。
- AsyncTask直接继承与Object类,位于android.os包中。
- 使用AsyncTask可以忽略Looper、MessageQueue、Handler等复杂对象,更便捷地完成耗时操作。
AsyncTask的使用
- 新建内部类继承AsyncTask
- 定义AsyncTask的三种泛型参数
- 重写doInBackground抽象方法
- 重写onPreExecute方法
- 重写onProgressUpdate方法
- 重写onPostExecute方法
- 在需要启动的地方调用execute方法
需要实现的几个方法及作用
AsyncTask有四种重要的回调方法
- onProgressUpdate
- doInBackground
- onPostExecute
- onPreExecute
这四个方法会在AsyncTask的不同时期进行自动调用,我们只需要实现这几个方法的内部逻辑即可。这四个方法的一些参数和返回值都是基于泛型的,而且泛型的类型还不一样,所以在AsyncTask的使用中会遇到三种泛型参数:Params, Progress 和 Result,如下图所示:
Params表示用于AsyncTask执行任务的参数的类型
Progress表示在后台线程处理的过程中,可以阶段性地发布结果的数据类型
Result表示任务全部完成后所返回的数据类型
我们通过调用AsyncTask的execute()方法传入参数并执行任务,然后AsyncTask会依次调用以下四个方法: - onPreExecute
- doInBackground
- onProgressUpdate
- onPostExecute
下面截取Android中AsyncTask使用详解中的例子
布局文件
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<Button android:id="@+id/btnDownload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="开始下载" />
<TextView android:id="@+id/textView"
android:layout_below="@id/btnDownload"
android:layout_width="match_parent"
android:l