博客
关于我
android asynctask handler 区别,AsyncTask与Thread+Handler简要分析
阅读量:790 次
发布时间: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/

    你可能感兴趣的文章
    Burp Suite使用进阶
    查看>>
    BurpSuite实战九之使用Burp Repeater
    查看>>
    BurpSuite实战八之使用Burp Intruder
    查看>>
    BurpSuite浏览器代理插件使用(附switchyomega与foxyproxy浏览器代理插件)
    查看>>
    Ceph RBD块存储详解
    查看>>
    Ceph企业级实战
    查看>>
    Ceph存储引擎详解
    查看>>
    Ceph对象存储详解
    查看>>
    Cisco防火墙配置实战
    查看>>
    CISSP-安全与风险管理
    查看>>
    Clickhouse NoSQL数据库详解
    查看>>
    ContextLoaderListener自动装配配置信息
    查看>>
    DCS控制系统概述
    查看>>
    DDNS动态域名无固定IPSEC配置实战
    查看>>
    DELL笔记本UEFI+GPT安装window10与Ubuntu双系统
    查看>>
    Docker+Jenkins+GIT CICD持续化集成实战
    查看>>
    Dockerfile 指令详解
    查看>>
    Docker安装MongoDB(附Docker虚拟机环境与MongoDB客户端连接工具)
    查看>>
    DRBD分布式存储解决方案实战
    查看>>
    DRBL+Clonezilla全自动批量安装操作系统
    查看>>