AsyncTask 是 Android 提供的一种异步任务处理类,它与线程类 Thread 相比,有以下优势:
1.preExcute() & postExcute()方法不仅可以进行预处理 & 收尾工作,而且它们归属于 UI 线程,所以你可以进行开启、关闭 loading 对话框等操作。
2.doInBackground()方法 & 构造器都支持泛型参数,且内部可以进行参数传递,封装性较好,注意doInBackground()属于后台线程,不能执行 UI 操作。
3.AsyncTask 比 Thread 更容易控制,它提供了cancel()方法,关于AsyncTask生命周期,
一、定义
- private class MyAsyncTask extern AsyncTask{
- ...
- }
二、实例化 & 执行
- MyAsyncTask task = new MyAsyncTask();
- task.excute();
三、AsyncTask 的生命周期
AsyncTask 会依次执行 onPreExcute()—doInBackground()—[可能执行onCancel()]—onPostExcute().
四、注意事项:
1.AsyncTask 的最大上限数量
我没有在SDK的文档中找到具体说明,但开发中已经领教过了,同种类型的 AsyncTask 实例,最大数量为 20 个。
如果超过,则会引发 RejectExcuteException,并 crash
因此,要考虑到用户的操作是否会引发频繁的 AsyncTask 实例化,若存在,则从 UI 上进行改进,比如:
分页机制;
线程池;
生产者-消费者模型。
2.取消AsyncTask任务
文档已经说明,cancel()方法不一定能成功,所以 onCancel() 回调方法不一定被调用。
但若一个 AsyncTask 结束,则一定会调用 onPostExcute() 方法。
对于一个 doInBackground()方法中含有 while/for 循环时,最好配置 isCancel标置来 break 循环。
AsyncTask类的三个泛型参数:
第一个指定了doInBackground() 方法输入参数的类型;
第二个指定了onProgressUpdate()方法输入参数的类型;
第三个指定了onPostExecute()方法输入参数的类型和doInBackground() 方法返回值的类型
这三个泛型参数的类型是根据你自己的业务需求来指定的。
onPreExecute(): 该方法在UI线程运行,当AsyncTask的execute()方法执行后,onPreExecute()会首先执行。可以在该方法中做一些准备工作,如初始化进度条的最大值。
doInBackground(Params...): 将在onPreExecute()方法执行后马上执行,该方法运行在子线程中,负责执行耗时操作。在执行耗时操作的过程中你可以不断地调用publishProgress()方法,导致onProgressUpdate()不断地被调用。
onProgressUpdate(Progress...),调用publishProgress()方法,就会导致该方法被执行,该方法运行在UI线程,例如在该方法中你可以更新进度条的显示。
onPostExecute(Result):doInBackground()方法执行后的返回结果会传给该方法,该方法运行在UI线程,在该方法中你可以显示处理结果。