博客
关于我
android asynctask handler 区别,AsyncTask与Thread+Handler简要分析
阅读量:791 次
发布时间:2023-01-24

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

Android异步处理是开发者在编写Android应用时听到非常重要的概念,旨在提高程序的响应速度和用户体验。通过异步处理,我们可以将耗时的操作,如网络请求、数据库查询和复杂的业务逻辑处理,从主线程中脱离出来,让这些任务在后台线程执行,而主线程继续处理UI操作。这样不仅提升了UI的流畅性,也避免了因长时间处理任务而导致的界面卡顿。

异步处理的目的:

  • 提高程序响应性:主线程专注于UI处理,后台线程负责耗时任务,用户不会感受到应用的卡顿。
  • 提升用户体验:通过减少对UI线程的占用,可以更流畅地处理用户交互和操作。
  • 异步处理的体现:

    • 耗时操作:如网络数据(图片)加载、数据库查询。
    • 复杂业务逻辑处理:如与服务器通信的操作、数据处理和转换。
    • UI操作:这些只能在主线程进行,否则可能会导致界面不更新。

    Android异步处理的原则:

  • 不会阻塞UI线程:所有目标线程的耗时操作必须运行完毕。
  • 确保UI线程安全:所有操作必须在UI线程中执行,不能在后台线程直接操作UI元素。
  • 常见实现方式:

    1. Activity.runOnUiThread(Runnable):

    • 在主线程直接执行指定的任务。
    Activity.runOnUiThread(new Runnable() {     @Override     public void run() {         // 在UI线程中执行任务     } });

    2. View.post(Runnable):

    • 将任务提交到View的后台队列,UI线程会自动处理。
    view.post(new Runnable() {    @Override    public void run() {        // 在UI线程中执行任务    }});

    3. View.postDelayed(Runnable, long):

    • 让任务在指定时间后在UI线程执行。
    view.postDelayed(new Runnable() {    @Override    public void run() {        // 在UI线程中执行任务    }}, 500); // 500ms后执行

    4. Handler:

    • 更常用的方式,通过发送消息到UI线程执行任务。
    handler.post(new Runnable() {    @Override    public void run() {        // 在UI线程中执行任务    }});

    AsyncTask的优势:

    • 轻量级:相比Handler,AsyncTask更轻量化,操作简单。
    • 规范性强:AsyncTask内部使用线程池,确保任务高效执行。
    • 自动UI更新:通过publishProgress可以将任务进度传递给UI线程,实现动态更新。

    AsyncTask的内部原理:

    • 线程池实现:AsyncTask本质上是一个线程池,所有任务都会在这个线程池中执行。
    • 消息传递:当后台线程需要更新UI时,会通过Handler将消息发送到UI线程。

    AsyncTask的成员变量:

    // 线程池配置private static final int CORE_POOL_SIZE = 5;    // 5个核心工作线程private static final int MAXIMUM_POOL_SIZE = 128; // 最多128个工作线程private static final int KEEP_ALIVE = 10;      // 空闲时间10秒private static final BlockingQueue sWorkQueue = new LinkedBlockingQueue(10);private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,        MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);

    Task生命周期:

  • 准备执行onPreExecute(),通常用于初始化UI上的进度条等。
  • 后台执行doInBackground(Params...),执行耗时任务,如网络请求或复杂计算。
  • 进度更新onProgressUpdate(Progress...),更新UI进度。
  • 任务完成onPostExecute(Result),将结果显示在UI上。
  • 取消任务onCancelled(),在UI线程中通知用户任务被取消。
  • AsyncTask的使用规则:

  • 必须在UI线程中创建Task实例
  • 必须在UI线程中执行execute()
  • 不能手动调用内部回调方法
  • 只能调用一次execute(),重复调用会抛出异常
  • AsyncTask的总结:

    • AsyncTask通过线程池实现异步处理,确保耗时任务在后台线程完成,同时通过任务状态更新UI界面。
    • 正确使用AsyncTask可以显著提升程序的性能和用户体验。

    通过以上方法,开发者可以更高效地管理Android应用的线程资源,实现 Responsiveness和用户友好的界面。

    转载地址:http://rxeyk.baihongyu.com/

    你可能感兴趣的文章
    el-select下拉框修改背景色
    查看>>
    el-table select事件判断当前项是否勾选
    查看>>
    Elasticsearch & Kibana & Filebeat开启SSL通信
    查看>>
    ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案
    查看>>
    ElasticSearch - 分布式搜索引擎底层实现——倒排索引
    查看>>
    ElasticSearch - 在 微服务项目 中基于 RabbitMQ 实现 ES 和 MySQL 数据异步同步(考点)
    查看>>
    ElasticSearch - 基于 docker 部署 es、kibana,配置中文分词器、扩展词词典、停用词词典
    查看>>
    ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合
    查看>>
    ElasticSearch - 基于 JavaRestClient 操作索引库和文档
    查看>>
    ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)
    查看>>
    ElasticSearch - 基于 “黑马旅游” 案例,实现搜索框、分页、条件过滤、附近酒店、广告置顶功能
    查看>>
    20241012更新_yum install 找不到合适的yum源_yum源不起作用_yum无法安装程序_Linux默认源替换---Linux工作笔记067
    查看>>
    ElasticSearch - 基础概念,以及和 mysql 的对比
    查看>>
    ElasticSearch - 索引库和文档相关命令操作
    查看>>
    elasticsearch 7.7.0 单节点配置x-pack
    查看>>
    ElasticSearch 中 REST API 详解
    查看>>
    Elasticsearch 之(16)_filter执行原理深度剖析(bitset机制与caching机制)
    查看>>
    Elasticsearch 时区问题
    查看>>
    Elasticsearch 索引字段类型为text,添加keyword类型操作
    查看>>
    Elasticsearch(四) es出现的问题:填坑
    查看>>