AsyncTask源码分析
发布日期:2021-05-14 09:35:21 浏览次数:26 分类:精选文章

本文共 1849 字,大约阅读时间需要 6 分钟。

AsyncTask,Android 中实现异步方式之一,允许在子线程执行数据操作,然后在主线程更新 UI。Handler 也可用于异步处理,详细内容可参考文档。

AsyncTask 的简单使用示例

创建一个继承自 AsyncTask 的类,指定三个泛型参数:ParamsProgressResult。在构造函数中,传入初始化参数或执行准备操作。

public class MyAsyncTask extends AsyncTask
{
@Override
protected Result doInBackground(Params... params) {
// 执行耗时操作,例如网络请求或数据库查询
}
@Override
protected void onPostExecute(Result result) {
// 更新 UI,处理结果
}
}

调用方式如下:

MyAsyncTask task = new MyAsyncTask();
task.execute(params);

任务流程

  • 线程池执行:默认使用一个线程池,每个 AsyncTask 对象只能执行一次。
  • 执行前准备:在主线程调用 onPreExecute
  • 数据处理:在子线程执行 doInBackground,可传递参数和更新进度。
  • 进度更新:通过 publishProgress 在主线程更新 UI。
  • 结果处理:在子线程完成后,通过 postResult 将结果发送至主线程触发 onPostExecute
  • 实现细节

    • 执行状态:确保每个 AsyncTask 只能一次执行,避免资源冲突。
    • 默认线程池:所有操作共享一个线程池,以提高效率且防止多次执行。
    • 安全机制:防止已取消的任务重复执行,确保UI响应性。

    InternalHandler 解析

    AsyncTask 内部使用 InternalHandler 处理消息,确保UI操作在主线程执行。getMainHandler 方法得到主线程的 Handler 实例。

    private static Handler getMainHandler() {
    synchronized (AsyncTask.class) {
    if (sHandler == null) {
    sHandler = new InternalHandler(Looper.getMainLooper());
    }
    return sHandler;
    }
    }
    private static class InternalHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case MESSAGE_POST_RESULT:
    result.mTask.finish(result.mData);
    break;
    case MESSAGE_POST_PROGRESS:
    result.mTask.onProgressUpdate(result.mData);
    break;
    }
    }
    }

    执行流程

  • 执行开始:调用 execute(Params... params)
  • 执行准备:依次调用 onPreExecute
  • 数据处理:在子线程执行 doInBackground,中间可调用 publishProgress
  • 结果更新:当数据处理完成,通过线程池调用 postResult,将结果发送至主线程。
  • UI更新:在主线程中调用 onPostExecuteonCancelled
  • 优点

    • 简化UI更新:确保UI操作在主线程执行,避免 GUI �ีป滞。
    • 提高效率:仅执行一次任务,减少资源占用。
    • 灵活性:支持多种进度更新和结果处理方式。

    通过理解这些关键点,可以有效地利用 AsyncTask 进行异步操作,确保应用程序的性能和用户体验。

    上一篇:HandlerThread源码分析
    下一篇:Handler源码分析

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月27日 10时09分46秒