
AsyncTask<Void, Void, Void> 泛型类型 :
AsyncTask 常用方法解析 :
AsyncTask 使用注意点 :
自定义 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> {
@Override
protected void onPreExecute() {
// doInBackground 之前执行的方法, 一般在该方法中执行初始化操作 ( 主线程, 可以更新 UI )
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... strings) {
// 主要的耗时操作是在该方法中执行的 ( 非主线程, 不能更新 UI )
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
// 在 doInBackground 中调用了 publishProgress 方法, 就会回调该方法
// 一般情况下是在该方法中执行更新 UI 的操作 ( 主线程, 可以更新 UI )
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Boolean aBoolean) {
// doInBackground 执行完毕后 , 调用 return 方法后 , 该方法会被调用 ( 主线程, 可以更新 UI )
super.onPostExecute(aBoolean);
}
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected void onCancelled(Boolean aBoolean) {
super.onCancelled(aBoolean);
}
}调用异步任务 :
public class MainActivity extends AppCompatActivity {
private MyAsyncTask mMyAsyncTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建并执行异步任务
mMyAsyncTask = new MyAsyncTask();
mMyAsyncTask.execute();
}
}AsyncTask 构造函数作用 : 创建一个新的异步任务 , 该构造函数必须在 UI 主线程调用 ;
构造函数中做了三件事 :
Callable 接口简介 : Callable 接口实现类定义一个没有参数的 call 方法 , 该接口与 Runnable 类似 , 两个接口中都被设计为 , 实现类对象的方法可能被另外一个线程执行
Runnable 与 Callable 接口对比 :
WorkerRunnable<Params, Result> 泛型 :
RunnableFuture 接口简介 : 该接口继承 Runnable 接口 , Future 接口 ;
在 WorkerRunnable 中的 call() 方法中执行了 doInBackground() 方法 ;
在 FutureTask 中的 done() 方法中 :
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) {
@Override
protected 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;
}
// ...
}