Android用HandlerThread模擬AsyncTask功能(ThreadTask)
前言
AsyncTask是個(gè)好東西,能處理絕大多數(shù)應(yīng)用線程和更新UI的任務(wù),由于其內(nèi)部使用了靜態(tài)線程池,如果你有一堆異步任務(wù)(例如全局定時(shí)更新數(shù)據(jù)、同一個(gè)Activity中多個(gè)AsyncTask同時(shí)執(zhí)行)其中有不能馬上執(zhí)行完的情況(例如網(wǎng)絡(luò)請(qǐng)求超時(shí)),那就糟了,其他任務(wù)都還等著呢,就會(huì)出現(xiàn)任務(wù)卡住的情況。此時(shí)就需要直接上Thread了,這里參考AsyncTask的API封裝了一個(gè)ThreadTask,便于必要時(shí)代碼替換,歡迎交流!
正文實(shí)例代碼:
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
public abstract class ThreadTask<Params, Progress, Result> {
private HandlerThread mHandlerThread;
private TaskHandler mHandler;
private TaskHandler mUiHandler;
private Params[] mParams;
public ThreadTask() {
mHandlerThread = new HandlerThread("ThreadTask", android.os.Process.THREAD_PRIORITY_BACKGROUND);
mHandlerThread.start();
mHandler = new TaskHandler(mHandlerThread.getLooper());
mUiHandler = new TaskHandler(Looper.getMainLooper());
}
protected abstract Result doInBackground(Params... params);
protected void onPreExecute() {
}
protected void onProgressUpdate(Progress... values) {
}
protected final void publishProgress(Progress... values) {
mUiHandler.obtainMessage(MESSAGE_PROGRESS, values).sendToTarget();
}
protected void onPostExecute(Result result) {
}
public final boolean isCancelled() {
return mHandlerThread.isInterrupted();
}
public final void cancel(boolean mayInterruptIfRunning) {
if (!mHandlerThread.isInterrupted()) {
try {
mHandlerThread.quit();
mHandlerThread.interrupt();
} catch (SecurityException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
onCancelled();
}
protected void onCancelled() {
}
public void execute(Params... params) {
mParams = params;
onPreExecute();
mHandler.sendEmptyMessage(MESSAGE_INBACKGROUND);
}
private static final int MESSAGE_INBACKGROUND = 0;
private static final int MESSAGE_POSTEXECUTE = 1;
private static final int MESSAGE_PROGRESS = 2;
private class TaskHandler extends Handler {
public TaskHandler(Looper looper) {
super(looper);
}
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_INBACKGROUND:
mUiHandler.obtainMessage(MESSAGE_POSTEXECUTE, doInBackground(mParams)).sendToTarget();
break;
case MESSAGE_POSTEXECUTE:
onPostExecute((Result) msg.obj);
mHandlerThread.quit();
break;
case MESSAGE_PROGRESS:
onProgressUpdate((Progress[]) msg.obj);
break;
}
}
}
}
代碼說(shuō)明:
由于onPreExecute和onPostExecute都在在主線程執(zhí)行,又要保證執(zhí)行的順序,所以采用Handler來(lái)控制執(zhí)行順序,根據(jù)Loop的不同,Handler能切換在子線程中執(zhí)行代碼還是在主線程中執(zhí)行代碼。
結(jié)束:
除了不受線程池控制以外,還能被真正的cancel掉(AsyncTask是不能的,只是一個(gè)標(biāo)記)。
以上就是Android 用HandlerThread模擬AsyncTask功能的代碼實(shí)現(xiàn),歡迎大家來(lái)交流。
相關(guān)文章
Android開(kāi)發(fā)之OpenGL繪制2D圖形的方法分析
這篇文章主要介紹了Android開(kāi)發(fā)之OpenGL繪制2D圖形的方法,結(jié)合實(shí)例形式分析了Android使用OpenGL ES的圖形繪制組件實(shí)現(xiàn)2D圖形繪制的原理、步驟及相關(guān)代碼注意事項(xiàng),需要的朋友可以參考下2017-09-09
基于Android實(shí)現(xiàn)系統(tǒng)重啟reboot功能
在某些特殊場(chǎng)景下(如設(shè)備管理、安全監(jiān)控、工控系統(tǒng)等),開(kāi)發(fā)者可能需要實(shí)現(xiàn)系統(tǒng)重啟功能,本文給大家介紹了如何基于Android實(shí)現(xiàn)系統(tǒng)重啟reboot功能,需要的朋友可以參考下2025-04-04
Android自定義View實(shí)現(xiàn)環(huán)形進(jìn)度條的思路與實(shí)例
最近看到豆瓣FM的音樂(lè)播放界面,有一個(gè)環(huán)形的進(jìn)度條挺不錯(cuò)的,最近有空就想著實(shí)現(xiàn)了,所以下面這篇文章主要給大家介紹了Android自定義View實(shí)現(xiàn)環(huán)形進(jìn)度條的思路與實(shí)例,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-04-04
Android使用AsyncTask下載圖片并顯示進(jìn)度條功能
這篇文章主要介紹了Android使用AsyncTask下載圖片并顯示進(jìn)度條功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Android 自定義view實(shí)現(xiàn)TopBar效果
這篇文章主要為大家詳細(xì)介紹了Android 自定義view實(shí)現(xiàn)TopBar效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Android 中為什么要用Fragment.setArguments(Bundle bundle)來(lái)傳遞參數(shù)
這篇文章主要介紹了Android 中為什么要用Fragment.setArguments(Bundle bundle)來(lái)傳遞參數(shù),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01
Android中ViewPager懶加載的優(yōu)化詳解
這篇文章主要為大家詳細(xì)介紹了Android中ViewPager懶加載的優(yōu)化相關(guān)技巧,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起了解下2024-04-04
Android中使用Theme來(lái)解決啟動(dòng)app時(shí)出現(xiàn)的空白屏問(wèn)題
相信大多數(shù)人一開(kāi)始都會(huì)對(duì)啟動(dòng)app的時(shí)候出現(xiàn)先白瓶或者黑屏然后才進(jìn)入第一個(gè)界面,例如:SplashActivity。那這是什么原因造成的呢?下面小編給大家介紹下2016-12-12

