AsyncTask 是 android 提供的轻量级的异步类,可以直接继承 AsyncTask 在类中实现异步操作,并提供接口反馈当前异步执行的程度,最后反馈执行的结果给 UI 主线程。
AsyncTask 定义了三种泛型类型:
- Params 启动执行任务的输入参数,比如 HTTP 请求的 URL 。
- Progress 后台执行任务的百分比。
- Result 后台执行任务最终返回的结果。
AysncTask必须被继承使用。子类至少覆盖 doInBackground(Params...) 方法,最经常覆盖 onPostExecute(Result) 方法。 当一个 AsyncTask 被执行,任务经过以下步骤:
- onPreExecute() , 在 UI 线程上调用任务后立即执行。
- doInBackground(Params...) , 比较耗时的操作都可以放在这里。异步任务的参数也被传到这步。在执行过程中可以调用 publishProgress(Progress...)来更新任务的进度。注意这里不能直接操作 UI 。
- onProgressUpdate(Progress...),一次调用 publishProgress(Progress...) 后调用 UI 线程。
- onPostExecute(Result) , 当后台计算结束时,调用 UI 线程。后台计算结果做一个参数传递到这步。
使用 AsyncTask 类,必须遵守以下的线程规则:
- Task 实例必须在 UI thread 中创建;
- execute 的方法必须在 UI thread 中调用;
- 不要手动调用 onPreExexute(), onPostExecute(Result),doBackground(Params...), onProgressUpdate(Progress...) 这几个方法;
- 该 task 只能被执行一次,否则多次调用时将会出现异常。