AsyncTask异步任务

本文对比了Android开发中AsyncTask与Thread+Handler在异步任务处理中的应用,指出AsyncTask适用于简单任务和UI更新,而Thread+Handler更灵活但需自行管理。随着开发发展,推荐使用Thread+Handler或现代异步处理方式如Kotlin协程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.AsyncTask:

(1)模板参数说明:

(2)自定义的任务类需要实现以下方法:

(3)AsyncTask有如下可直接调用的启停方法:

 2.Thread + Handler:


在Android开发中,AsyncTask(异步任务)Thread + Handler 都用于在后台执行任务,但它们的使用场景和常见程度有所不同。AsyncTask 在简单的异步任务和UI更新场景下比较常见,而 Thread + Handler 则更适用于复杂的异步任务和需要更精细控制的情况。然而,随着Android开发的发展,推荐使用 Thread + Handler 或者更现代化的异步任务处理方式,如 Kotlin 协程等。

1.AsyncTask:

AsyncTask(异步任务) 是 Android 提供的一个类,用于在后台执行异步任务并在主线程更新UI。它封装了线程管理和UI线程更新,使得在后台执行任务并更新UI更加方便。AsyncTask 适合较为简单的异步任务,如网络请求、数据库操作等,且需要在后台执行完成后更新UI的情况。在较早的Android版本中,AsyncTask 是处理异步任务的主要方法之一。但是,由于其存在一些局限性和安全隐患(如内存泄漏、活动销毁时的异常处理等),且AsyncTask的全局线程池只有5个工作线程,如果同一时间有太多的线程请求,可能会造成阻塞;因此不建议使用`AsyncTask`进行大量的网络数据获取 ,在较新的Android开发中逐渐被废弃或不推荐使用

Asynctask是一个模板类(Asynctask<Params, Progress, Result>),从它派生而来的新类需要指定模板的参数类型。

(1)模板参数说明:

  • Params:任务启动时的输入参数,比如HTTP访问的URL地址、请求报文等。可设置为String类型或自定义的数据结构。
  • Progress:任务执行过程中的进度。一般设置为Integer类型,表示当前处理进度。
  • Result:任务执行完的结果参数,比如HTTP调用的执行结果、返回报文等。可设置为String类型或自定义的数据结构。

(2)自定义的任务类需要实现以下方法:

  • onPreExecute:准备执行任务时触发。该方法在doInBackground方法执行之前调用。
  • doInBackground:在后台执行的业务处理。网络请求等异步处理操作都放在该方法中,输入参数对应execute方法的输入参数,输出参数对应onPostExecute方法的输入参数。注意,该方法运行于分线程,不能操作界面,其他方法都能操作界面。
  • onProgressUpdate:在doInBackground方法中调用publishProgress方法时触发。该方法通常用于在处理过程中刷新进度条。
  • onPostExecute:任务执行完成时触发,方法内部可在页面上显示处理结果。该方法在doInBackground方法执行完毕后调用,输入参数对应doInBackground方法的输出参数。
  • onCancelled:调用任务对象的cancel方法时触发。表示取消任务并返回。

(3)AsyncTask有如下可直接调用的启停方法:

  • execute:开始执行异步处理任务。
  • executeOnExecutor:以指定的线程池模式执行任务。AsyncTask 内置的线程池模式有以下两个。AsyncTask.THREAD_POOL_EXECUTOR表示异步线程池(各任务间没有先后顺序,即有可能某任务在后面调用却先执行)。AsyncTask.SERIAL_EXECUTOR表示同步线程池(各任务按照代码调用的先后顺序依次排队等待执行),execute方法默认使用SERIAL_EXECUTOR
  • publishProgress:更新进度。该方法只能在doInBackground方法中调用,调用后会触发onProgressUpdate方法。
  • get:获取处理结果。
  • cancel:取消任务。该方法调用后,doInBackground方法中的处理可能不会马上停止;若想立即停止处理,则可在doInBackground方法中加入isCancelled的判断。
  • isCancelled:判断该任务是否取消。true表示取消,false表示未取消。
  • getStatus:获取任务状态。PENDING表示未执行(onPreExecute处理之前);RUNNING表示正在执行(onPreExecute、doInBackground、onPostExecute运行期间);FINISH表示执行完毕(onPostExecute处理结束)。

 2.Thread + Handler:

Thread(线程) 是Java中的线程类,用于创建和管理线程。Handler(处理器) 用于与UI线程进行通信,通过发送消息或者投递任务来更新UI。Thread + Handler 的组合更加灵活,适用于复杂的异步任务和需要更精细控制的情况。这种方式需要开发者自己管理线程的生命周期和线程间的通信,相对于 AsyncTask 更为底层,但也更加灵活和强大。Thread + Handler 在一些特定场景下更为常见,尤其是对于需要精确控制线程执行顺序、避免内存泄漏以及实现自定义的线程池等需求。

非主线程中创建Handler时请注意需要手动初始化Loop,Looper.prepare()和Looper.loop()、Looper.quit();主线程因会自动初始化Loop无需手动初始化。

//非主线程
public class MyThread extends Thread{
    public Handler handler;
    public void run() {
        Looper.prepare();
        handler=new Handler(){
            public void handleMessage(@NonNull Message msg) {
                //执行代码
            }
        };
        Looper.loop();
        // .loop()以下代码在 .quit()前不执行
    }
}


//主线程
Handler handler;
handler=new Handler(){
    public void handleMessage(@NonNull Message msg) {
        //执行代码
    }
};

tag:异步任务,AsyncTask,异步线程,线程,thread,处理器,handler 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下嗷呜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值