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功能的代码实现,欢迎大家来交流。