Android用HandlerThread模拟AsyncTask功能(ThreadTask)
程序员文章站
2024-03-04 21:14:30
前言
asynctask是个好东西,能处理绝大多数应用线程和更新ui的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据、同一个ac...
前言
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功能的代码实现,欢迎大家来交流。
上一篇: Python获取当前页面内所有链接的四种方法对比分析
下一篇: IO流常用类的总结