AsyncTask.java
AsycnTask-Api
AsyncTask是后臺(tái)執(zhí)行操作在UI線程發(fā)布結(jié)果的對(duì)象,很輕松的使用UI線程,用于耗時(shí)較短的后臺(tái)操作癞志。
AsyncTask原理
AsyncTas類初始化sDefaultExecutor和sHandler變量,用于執(zhí)行后臺(tái)執(zhí)行任務(wù)和分發(fā)消息給主線程
AsyncTask對(duì)象創(chuàng)建時(shí)實(shí)現(xiàn)后臺(tái)執(zhí)行函數(shù)doInBackground()和發(fā)布UI結(jié)果的回調(diào)函數(shù)onPostExecute()
構(gòu)造AsyncTask時(shí)
構(gòu)建類型為WorkerRunnable的mWork對(duì)象,執(zhí)行doInBackground()糠赦,然后發(fā)送結(jié)束消息給sHandler
構(gòu)建類型FutureTask的mFuture對(duì)象,以mWork為回調(diào)參數(shù)锅棕,并重寫任務(wù)結(jié)束回調(diào)方法done()拙泽,如果上面沒(méi)有發(fā)送消息沒(méi)有成功會(huì)再次發(fā)給sHandler
mWork和mFuture中發(fā)送消息都調(diào)用postResult(),message的obj指向的是AsyncTaskResult對(duì)象裸燎,其包含AsyncTask對(duì)象和消息類型標(biāo)記
execute()啟動(dòng)時(shí)在執(zhí)行線程池處理任務(wù)之前先調(diào)用onPreExecute()
mFuture進(jìn)入sDefaultExecutor線程池任務(wù)隊(duì)列消費(fèi)
任務(wù)執(zhí)行結(jié)束調(diào)用FutureTask的done()方法顾瞻,將執(zhí)行完畢消息通過(guò)postResult()發(fā)送給sHandler
sHandler收到消息根據(jù)what標(biāo)記分別調(diào)用asyncTask對(duì)象的發(fā)布結(jié)果回調(diào)方法和更新UI進(jìn)度方法
注明:
AsyncTask必須在主線程中創(chuàng)建
后臺(tái)執(zhí)行回調(diào)調(diào)用publishProgress()就是發(fā)送更新進(jìn)度消息給sHandler
動(dòng)手實(shí)現(xiàn)
public abstract class AsyncTask<Params, Progress, Result> {
private static final int MESSAGE_POST_RESULT = 1;//結(jié)束標(biāo)記
private static final int MESSAGE_POST_PROGRESS = 2;//更新進(jìn)度標(biāo)記
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();//cpu核心數(shù)
//最少2個(gè)或者4個(gè)核心線程
//cpu核心數(shù)少一個(gè)線程,以免飽和
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE_SECONDS = 30;
//線程創(chuàng)建工廠
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
////參數(shù)2為線程名字
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};
//最多容納128個(gè)任務(wù)德绿,再多任務(wù)就會(huì)被阻塞
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
static {
//初始化線程執(zhí)行器配置
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
sPoolWorkQueue, sThreadFactory);
threadPoolExecutor.allowCoreThreadTimeOut(true);
sDefaultExecutor = threadPoolExecutor;//暫不使用哪個(gè)串行執(zhí)行的執(zhí)行器
}
private static volatile Executor sDefaultExecutor;
private static InternalHandler sHnadler;
//不適用懶加載直接使用
static {
sHnadler = new InternalHandler();
}
private final WorkerRunnable<Params, Result> mWorker;
private final FutureTask<Result> mFuture;
public AsyncTask() {
//mWorker的參數(shù)在execute的時(shí)候補(bǔ)上
mWorker = new WorkerRunnable<Params, Result>() {
@Override
public Result call() throws Exception {
Result result = doInBackground(mParams);//調(diào)用后臺(tái)執(zhí)行操作
postResult(result);//通知handler調(diào)用發(fā)布結(jié)果回調(diào)
return result;
}
};
mFuture = new FutureTask<Result>(mWorker);//暫不包裝二次檢查發(fā)送
}
//發(fā)送結(jié)束消息給handler
private void postResult(Result result) {
Message message = Message.obtain();
message.what = MESSAGE_POST_RESULT;
message.obj = new AsyncTaskResult(this, result);
}
//發(fā)送更新消息給handler
protected void publishProgress(Progress... values) {
Message message = Message.obtain();
message.what = MESSAGE_POST_PROGRESS;
message.obj = new AsyncTaskResult(this, values);
}
//執(zhí)行任務(wù)
public void execute(Params... values) {
onPreExecute();
mWorker.mParams = values;
sDefaultExecutor.execute(mFuture);
}
protected void onPreExecute() {
}
//后臺(tái)操作回調(diào)
protected abstract Result doInBackground(Params... var1);
//發(fā)布結(jié)果回調(diào)
protected void onPostExecute(Result result) {
}
//進(jìn)度回調(diào)
protected void onProgressUpdate(Progress... values) {
}
//主線程處理消息調(diào)用asyncTask的回調(diào)
private static class InternalHandler extends Handler {
public InternalHandler() {
super(Looper.getMainLooper());
}
@Override
public void handleMessage(Message msg) {
AsyncTaskResult result = (AsyncTaskResult) msg.obj;
switch (msg.what) {
case MESSAGE_POST_RESULT:
result.mTask.onPostExecute(result.mData[0]);//發(fā)布結(jié)果回調(diào)
break;
case MESSAGE_POST_PROGRESS:
result.mTask.onProgressUpdate(result.mData);//更新進(jìn)度回調(diào)
break;
}
}
}
//通過(guò)線程傳遞給doInBackground用戶定義好的參數(shù)
private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
Params[] mParams;
}
//消息攜帶類
private static class AsyncTaskResult<Result> {
AsyncTask mTask;//消息發(fā)送所屬AsyncTask
Result[] mData;//結(jié)果參數(shù)
public AsyncTaskResult(AsyncTask mTask, Result... mData) {
this.mTask = mTask;
this.mData = mData;
}
}
}
使用
asyncTask.execute("http://www.baidu.com");
...
AsyncTask<String, Long, String> asyncTask = new AsyncTask<String, Long, String>() {
@Override
protected String doInBackground(String... strings) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "hello";
}
@Override
protected void onPostExecute(String value) {
super.onPostExecute(value);
Toast.makeText(MainActivity.this, value + " over", Toast.LENGTH_SHORT).show();
}
};