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ò)請求超時(shí)),那就糟了,其他任務(wù)都還等著呢,就會出現(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; } } } }
代碼說明:
由于onPreExecute和onPostExecute都在在主線程執(zhí)行,又要保證執(zhí)行的順序,所以采用Handler來控制執(zhí)行順序,根據(jù)Loop的不同,Handler能切換在子線程中執(zhí)行代碼還是在主線程中執(zhí)行代碼。
結(jié)束:
除了不受線程池控制以外,還能被真正的cancel掉(AsyncTask是不能的,只是一個(gè)標(biāo)記)。
以上就是Android 用HandlerThread模擬AsyncTask功能的代碼實(shí)現(xiàn),歡迎大家來交流。
相關(guān)文章
android ScrollView實(shí)現(xiàn)下拉放大頭部圖片
這篇文章主要為大家詳細(xì)介紹了android ScrollView實(shí)現(xiàn)下拉放大頭部圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android 中 ActivityLifecycleCallbacks的實(shí)例詳解
這篇文章主要介紹了Android 中 ActivityLifecycleCallbacks的實(shí)例詳解的相關(guān)資料,希望通過本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09AndroidManifest.xml uses-feature功能詳解
這篇文章主要介紹了AndroidManifest.xml uses-feature功能,較為詳細(xì)的分析了Android屬性過濾操作的功能與相關(guān)技巧,需要的朋友可以參考下2016-10-10詳解Retrofit Interceptor(攔截器) 攔截請求并做相關(guān)處理
本篇文章主要介紹了詳解Retrofit Interceptor(攔截器) 攔截請求并做相關(guān)處理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04Android 實(shí)現(xiàn)閃屏頁和右上角的倒計(jì)時(shí)跳轉(zhuǎn)實(shí)例代碼
本文給大家分享一段實(shí)例代碼給大家介紹android實(shí)現(xiàn)閃屏頁和右上角的倒計(jì)時(shí)跳轉(zhuǎn)實(shí)例代碼,閃屏頁用到了handler和CountDownTimer類,還需配置一下Activity的主題,感興趣的朋友參考下吧2016-02-02Android給scrollView截圖超過屏幕大小形成長圖
這篇文章主要為大家詳細(xì)介紹了Android給scrollView截圖超過屏幕大小形成長圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12