Android用HandlerThread模拟AsyncTask功能(ThreadTask)
前言
AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据、同一个Activity中多个AsyncTask同时执行)其中有不能马上执行完的情况(例如网络请求超时),那就糟了,其他任务都还等着呢,就会出现任务卡住的情况。此时就需要直接上Thread了,这里参考AsyncTask的API封装了一个ThreadTask,便于必要时代码替换,欢迎交流!
正文实例代码:
importandroid.os.Handler; importandroid.os.HandlerThread; importandroid.os.Looper; importandroid.os.Message; publicabstractclassThreadTask<Params,Progress,Result>{ privateHandlerThreadmHandlerThread; privateTaskHandlermHandler; privateTaskHandlermUiHandler; privateParams[]mParams; publicThreadTask(){ mHandlerThread=newHandlerThread("ThreadTask",android.os.Process.THREAD_PRIORITY_BACKGROUND); mHandlerThread.start(); mHandler=newTaskHandler(mHandlerThread.getLooper()); mUiHandler=newTaskHandler(Looper.getMainLooper()); } protectedabstractResultdoInBackground(Params...params); protectedvoidonPreExecute(){ } protectedvoidonProgressUpdate(Progress...values){ } protectedfinalvoidpublishProgress(Progress...values){ mUiHandler.obtainMessage(MESSAGE_PROGRESS,values).sendToTarget(); } protectedvoidonPostExecute(Resultresult){ } publicfinalbooleanisCancelled(){ returnmHandlerThread.isInterrupted(); } publicfinalvoidcancel(booleanmayInterruptIfRunning){ if(!mHandlerThread.isInterrupted()){ try{ mHandlerThread.quit(); mHandlerThread.interrupt(); }catch(SecurityExceptione){ e.printStackTrace(); }catch(Exceptione){ e.printStackTrace(); } } onCancelled(); } protectedvoidonCancelled(){ } publicvoidexecute(Params...params){ mParams=params; onPreExecute(); mHandler.sendEmptyMessage(MESSAGE_INBACKGROUND); } privatestaticfinalintMESSAGE_INBACKGROUND=0; privatestaticfinalintMESSAGE_POSTEXECUTE=1; privatestaticfinalintMESSAGE_PROGRESS=2; privateclassTaskHandlerextendsHandler{ publicTaskHandler(Looperlooper){ super(looper); } @SuppressWarnings("unchecked") @Override publicvoidhandleMessage(Messagemsg){ switch(msg.what){ caseMESSAGE_INBACKGROUND: mUiHandler.obtainMessage(MESSAGE_POSTEXECUTE,doInBackground(mParams)).sendToTarget(); break; caseMESSAGE_POSTEXECUTE: onPostExecute((Result)msg.obj); mHandlerThread.quit(); break; caseMESSAGE_PROGRESS: onProgressUpdate((Progress[])msg.obj); break; } } } }
代码说明:
由于onPreExecute和onPostExecute都在在主线程执行,又要保证执行的顺序,所以采用Handler来控制执行顺序,根据Loop的不同,Handler能切换在子线程中执行代码还是在主线程中执行代码。
结束:
除了不受线程池控制以外,还能被真正的cancel掉(AsyncTask是不能的,只是一个标记)。
以上就是Android 用HandlerThread模拟AsyncTask功能的代码实现,欢迎大家来交流。