文章目录
一、AsyncTask 参数简介二、AsyncTask 方法简介三、AsyncTask 基本用法四、AsyncTask 构造函数源码解析五、AsyncTask 构造函数相关源码注释一、AsyncTask 参数简介
AsyncTask<Void, Void, Void> 泛型类型 :
异步任务开始时, execute() 方法传入的参数类型 , 也是 doInBackground() 方法传入的参数类型 ;异步任务执行时, 进度值类型 , onProgressUpdate() 方法传入的参数类型 ;异步任务结束时, 结果类型 , onPostExecute() 方法传入参数类型 , 或 onCancelled() 方法参数 ;
二、AsyncTask 方法简介
AsyncTask 常用方法解析 :
doInBackground() :核心方法 , 执行异步任务 , 该方法在 子线程 中执行 ;onPreExecute() :在 doInBackground() 执行前先执行的方法 , 主线程 中执行 , 可更新 UI 界面 ;onProgressUpdate() :调用 publishProgress() 回调的方法 , 主线程 中执行 , 可更新 UI 界面 ;onPostExecute() :doInBackground() 执行完毕后再执行的方法 , 主线程 中执行 , 可更新 UI 界面 ;
三、AsyncTask 基本用法
AsyncTask 使用注意点 :
UI 线程创建UI 线程调用执行 execute()创建后只能执行一次
自定义 AsyncTask 异步任务 :
package kim.hsl.aa;import android.os.AsyncTask;/*** AsyncTask<String, Integer, Boolean> 泛型解析* - 1. 异步任务开始时 , execute 方法传入的参数类型* - 2. 异步任务执行时 , 进度值类型* - 3. 异步任务结束时 , 结果类型*/public class MyAsyncTask extends AsyncTask<String, Integer, Boolean> {@Overrideprotected void onPreExecute() {// doInBackground 之前执行的方法, 一般在该方法中执行初始化操作 ( 主线程, 可以更新 UI )super.onPreExecute();}@Overrideprotected Boolean doInBackground(String... strings) {// 主要的耗时操作是在该方法中执行的 ( 非主线程, 不能更新 UI )return null;}@Overrideprotected void onProgressUpdate(Integer... values) {// 在 doInBackground 中调用了 publishProgress 方法, 就会回调该方法// 一般情况下是在该方法中执行更新 UI 的操作 ( 主线程, 可以更新 UI )super.onProgressUpdate(values);}@Overrideprotected void onPostExecute(Boolean aBoolean) {// doInBackground 执行完毕后 , 调用 return 方法后 , 该方法会被调用 ( 主线程, 可以更新 UI )super.onPostExecute(aBoolean);}@Overrideprotected void onCancelled() {super.onCancelled();}@Overrideprotected void onCancelled(Boolean aBoolean) {super.onCancelled(aBoolean);}}
调用异步任务 :
public class MainActivity extends AppCompatActivity {private MyAsyncTask mMyAsyncTask;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 创建并执行异步任务mMyAsyncTask = new MyAsyncTask();mMyAsyncTask.execute();}}
四、AsyncTask 构造函数源码解析
AsyncTask 构造函数作用 :创建一个新的异步任务 , 该构造函数必须在 UI 主线程调用 ;
构造函数中做了三件事 :
获取 Handler :该 Handler 是主线程的 Handler ;创建 WorkerRunnable :WorkerRunnable 是实现了 Callable 接口的抽象类 , 该接口中只定义了一个 call() 函数 ;创建 FutureTask :FutureTask 是实现了 RunnableFuture 接口的类 , 该接口中定义了一个 run() 方法 ;
Callable 接口简介 :Callable 接口实现类定义一个没有参数的 call 方法 , 该接口与 Runnable 类似 , 两个接口中都被设计为 , 实现类对象的方法可能被另外一个线程执行
Runnable 与 Callable 接口对比 :
Runnable 不能返回结果 , 不能抛出检查过的异常Callable 是一个任务 , 返回一个结果 , 并抛出异常 ;
WorkerRunnable<Params, Result> 泛型 :
Params 是参数类型 , 也是 AsyncTask 的 doInBackground() 方法的输入参数类型Result 是返回值类型 , 也是 AsyncTask 的 doInBackground() 方法的执行完毕的返回值类型
RunnableFuture 接口简介 :该接口继承 Runnable 接口 , Future 接口 ;
在普通的 Thread 方法中 , 调用线程的 start() 方法 , 会执行 Thread 对象中的 run() 方法 , 但是方法执行的结果我们是不知道的 ;
而在 AsyncTask 异步任务中 , 执行 doInBackground() 方法 , 该方法也是在子线程中执行的 , 可以得到该方法执行的结果 , 这个执行结果是靠 Future 接口得到的 ;
在 WorkerRunnable 中的 call() 方法中执行了 doInBackground() 方法 ;
在 FutureTask 中的 done() 方法中 :
执行 postResultIfNotInvoked 方法 : 如果没有被调用 , 那么传递结果 ; 执行 postResult() 方法 : 在该方法中使用主线程 Handler 发送 MESSAGE_POST_RESULT 消息 , 触发 AsyncTask 异步任务的 onPostExecute() 方法
五、AsyncTask 构造函数相关源码注释
public abstract class AsyncTask<Params, Progress, Result> {// .../*** 创建一个新的异步任务 . 该构造函数必须在 UI 主线程调用 . * @hide 隐藏方法*/public AsyncTask(@Nullable Looper callbackLooper) {// 获取 Handler , 用于线程间通信 // 获取主线程 Looper 对应的 Handler , 或者创建主线程对应 Handler mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()? getMainHandler(): new Handler(callbackLooper);// 创建工作任务 , 该类是 Callable 接口的子类// 实际的 doInBackground() 耗时任务 , 是在该任务中执行的 mWorker = new WorkerRunnable<Params, Result>() {public Result call() throws Exception {mTaskInvoked.set(true);Result result = null;try {Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);// 正式执行 doInBackground() 耗时任务 , 在子线程中执行 result = doInBackground(mParams);Binder.flushPendingCommands();} catch (Throwable tr) {mCancelled.set(true);throw tr;} finally {postResult(result);}return result;}};// 未来的任务 mFuture = new FutureTask<Result>(mWorker) {@Overrideprotected void done() {try {// 最终会调用该方法 postResultIfNotInvoked(get());} catch (InterruptedException e) {android.util.Log.w(LOG_TAG, e);} catch (ExecutionException e) {throw new RuntimeException("An error occurred while executing doInBackground()",e.getCause());} catch (CancellationException e) {postResultIfNotInvoked(null);}}};}// 如果没有被调用 , 那么传递结果 private void postResultIfNotInvoked(Result result) {final boolean wasTaskInvoked = mTaskInvoked.get();if (!wasTaskInvoked) {// 传递结果 postResult(result);}}// 传递结果 , 发送 MESSAGE_POST_RESULT 消息 , 该消息会实际上触发 异步任务 AsyncTask 的 onPostExecute() 方法private Result postResult(Result result) {@SuppressWarnings("unchecked")Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,new AsyncTaskResult<Result>(this, result));message.sendToTarget();return result;}// ... /*** WorkerRunnable 实现 Callable 接口* Callable 是一个任务 , 返回一个结果 , 并抛出异常* 实现类定义一个没有参数的 call 方法 * 该接口与 Runnable 类似 , 两个接口中都被设计为 : 实现类对象的方法可能被另外一个线程执行* Runnable 不能返回结果 , 不能抛出检查过的异常 * * Params 是参数类型 , 也是 AsyncTask 的 doInBackground() 方法的输入参数类型* Result 是返回值类型 , 也是 AsyncTask 的 doInBackground() 方法的执行完毕的返回值类型 */private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {Params[] mParams;}// ... }