編輯:關於Android編程
前言
AsyncTask是個好東西,能處理絕大多數應用線程和更新UI的任務,由於其內部使用了靜態線程池,如果你有一堆異步任務(例如全局定時更新數據、同一個Activity中多個AsyncTask同時執行)其中有不能馬上執行完的情況(例如網絡請求超時),那就糟了,其他任務都還等著呢,就會出現任務卡住的情況。此時就需要直接上Thread了,這裡參考AsyncTask的API封裝了一個ThreadTask,便於必要時代碼替換,歡迎交流!
正文實例代碼:
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都在在主線程執行,又要保證執行的順序,所以采用Handler來控制執行順序,根據Loop的不同,Handler能切換在子線程中執行代碼還是在主線程中執行代碼。
結束:
除了不受線程池控制以外,還能被真正的cancel掉(AsyncTask是不能的,只是一個標記)。
以上就是Android 用HandlerThread模擬AsyncTask功能的代碼實現,歡迎大家來交流。
一般而言在Android上使用JAVA實現彩圖轉換為灰度圖,與J2ME上的實現方法類似,不過遇到頻繁地轉換或者是大圖轉換時,就必須使用NDK來提高速度了。本文主要通過JA
iOS中有封裝好的選擇圖片後長按出現動畫刪除效果,效果如下 而Android找了很久都沒有找到有這樣效果的第三方組件,最後懶得找了還是自己實現這效果
一、前言上篇說清楚了Unity和Android調用的方式,但很多實際接入的部分沒有講的很詳細,因為重頭在這篇,會詳細講述具體接入Android SDK的方式,和怎麼去做一
這篇博文中主要從以下幾點進行敘述: 1、Android Studio安裝與使用 2、Android Studio特