简介

AsyncTask是android提供的一个帮我们执行耗时任务的工具,在API Level3中被引入进来。在android中,UI线程不可以执行耗时的工作,因此,一些负责和初始化或者运算的工作都必须放置在非UI线程中进行。因此Android提供了一个这样的工具来帮我们简化启动和管理线程的工作。

范型参数


AsyncTask是一个抽象范型类,它有三个范型类型参数Params, Progress 和 Result。自定义一个AsyncTask类至少要实现它的doInBackground 方法,一个最简单的实现如下:
private static class MyAsyncTask extends AsyncTask<Param, Progress, Result> {     @Override     protected Result doInBackground(Param... params) {         return new Result();     } } 
其中,Params 是 doInBackground的参数,调用者通过这个类型来向AsyncTask传递参数;Progress是用来描述AsyncTask的任务进度的,在doInBackground中可以通过调用publishProgress来通知外界任务进度的变化;Result 是AsyncTask任务执行的结果,在doInBackground中作为返回值返回。

回调方法


AsyncTask将线程相关的实现隐藏了起来,同时提供了一些回调方法供我们对它的行为进行定制。

Result doInBackground(Params... params)
用来执行任务的方法,将耗时/复杂的运行放在这个函数中执行,运行在非UI线程中。
void onCancelled(Result result)
当任务被cancel后(向工作线程发送interrupt后)调用,运行在UI线程中,API Level 11中引入。 注意:
  1. 如果不重载此方法 或者 重载此方法后仍然调用了 super.onCancelled(result),则会导致onCancel()回调被调用,否则onCancel()将不会被调用。
  2. 如果cancel AsyncTask时,任务已经执行完成(doInBackground已经返回),onCancel将不会被调用。
void onCancelled() 
当任务被cancel时候调用,运行在UI线程中。详情参见void onCancelled(Result result)

void onPostExecute(Result result)
当doInBackground执行完成后调用,运行在UI线程中,如果任务被cancel将不会被调用。

void onPreExecute()
在doInBackground调用之前调用,运行在UI线程。

void onProgressUpdate (Progress... values) 
更新进度的回调,运行在UI线程,需要在doInBackground中调用publishProgress 才会触发这个回调。

AsyncTask的使用方法


1.启动


使用execute方法启动一个AsyncTask,并传入启动参数

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


在APILevel11以后,android提供了一个快捷启动AsyncTask的方法

static void execute(Runnable runnable)

2.停止


使用cancel方法来停止一个AsyncTask的执行

final boolean cancel(boolean mayInterruptIfRunning)

如果Task还没有开始执行,那么它将不会被执行到。如果Task已经开始执行,那么要看cancel传入的参数,如果传入true,那么AsyncTask的工作线程将会收到一个Interrupt消息,反之则不会。可以使用isCanceled来查询AsyncTask是否已经cancel

3.进度


final void publishProgress (Progress... values) 

这个方法用于更新进度,如果Task已经被cancel了,则该调用无效。这个函数会触发onProgressUpdate回调


AsyncTask回调函数的调用流程


AsyncTask的回调函数的调用顺序如下(不考虑cancel情况) onPreExecute -->doInBackground ->onProgressUpdate(又publishProgress触发) ->onPostExecute

注意事项

  1. AsyncTask的实现类必须在UI线程中装载。
  2. AsyncTask的实例必须在UI线程中创建。
  3. AsyncTask必须在UI线程中启动。
  4. 一个AsyncTask对象只能一次性使用。
  5. 不要自行调用AsyncTask的回调函数。

更多相关文章

  1. Android(安卓)异步消息处理机制(Handler 、 Looper 、MessageQueu
  2. Android消息机制之ThreadLocal浅析
  3. Android多线程下载远程图片
  4. ANDROID音频系统散记之五:如何绕开多媒体音轨的重采样
  5. Android使用JNI生成.so文件并调用(使用传统生成.h的方法)
  6. Android开发实践:多线程编程小结
  7. Android实现分享(Share)功能
  8. Android基础 : Android(安卓)Service
  9. Android多线程下载远程图片

随机推荐

  1. k8s中关于kube-proxy的iptables模式和ipv
  2. 3.19作业
  3. 写用户注册表
  4. Docker容器技术之Docker file
  5. 浅析ElasticSearch原理
  6. 如何打造高质量的SSP广告引擎(内部干货分
  7. 手把手从0开始教你搭建Jumpserver,为服务
  8. 诊断虚拟机频繁 OOM 的问题
  9. 运维工作流程(入坑必看)
  10. 京东云和金山云合并?有人确认 1 月份会宣