Android用HandlerThread模拟AsyncTask功能(ThreadTask)
2019/7/7 19:40:56
本文主要是介绍Android用HandlerThread模拟AsyncTask功能(ThreadTask),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
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用HandlerThread模拟AsyncTask功能(ThreadTask)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-18android.permission.read_media_video
- 2024-01-18android_getaddrinfo failed eai_nodata
- 2024-01-18androidmo
- 2024-01-15Android下三种离屏渲染技术
- 2024-01-09Android 蓝牙使用
- 2024-01-06Android对接华为AI - 文本识别
- 2023-11-15代码安全之代码混淆及加固(Android)
- 2023-11-10简述Android语音播报TTS
- 2023-11-06Android WiFi工具类
- 2023-07-22Android开发未来的出路