AsyncTask、HandlerThread、IntentService的差异

本文介绍了AsyncTask、HandlerThread和IntentService的区别。AsyncTask由Handler和两个线程池实现,3.0前后执行方式有变化;HandlerThread继承Thread,通过Looper创建消息队列;IntentService继承Service,封装了HandlerThread和Handler,适合执行高优先级后台任务,按顺序处理任务。

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

有过一篇介绍过 AsyncTask 原理解析
也写过一篇介绍Android Service和IntentService的区别
现在就说说这三个的区别:
AsyncTask

 public static final Executor SERIAL_EXECUTOR = new SerialExecutor();

public static final Executor THREAD_POOL_EXECUTOR;

    static {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
                sPoolWorkQueue, sThreadFactory);
        threadPoolExecutor.allowCoreThreadTimeOut(true);
        THREAD_POOL_EXECUTOR = threadPoolExecutor;
    }
  1. 内部是Handler和两个线程池实现的,Handler切换线程到主线程。线程池SerialExecutor 用于任务的排队,而线程池 THREAD_POOL_EXECUTOR 用于真正的执行任务。当AsyncTask执行execute方法时会封装出一个FutureTask对象,将这个对象加入队列中,如果此时没有正在执行的任务,就执行它,执行完成之后继续执行队列中下一个任务,执行完成通过Handler将事件发送到主线程。
  2. AsyncTask必须在主线程初始化,因为内部的Handler是一个静态对象,在AsyncTask类加载的时候他就已经被初始化了。在Android3.0开始,execute方法串行执行任务的,一个一个来,3.0之前是并行执行的。如果要在3.0上执行并行任务,可以调用executeOnExecutor方法。

HandlerThread:使用 HandlerThread的一个场景就是 IntentService

public void onCreate() {
      
	   // 当 IntentService 被第一次启动时,它的 onCreate 方法就会被调用,onCreate方法会创建一个  HandlerThread,然后使用它的 Looper 来构造一个 Handler 对象 mServiceHandler,这样通过mServiceHandler 发送的消息最终都会在 HandlerThread 中执行,从这个角度来看,IntentService 也可用于执行后台任务
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }
  1. 继承 Thread。
  2. 开启start()后,在run()方法中会通过Looper 创建消息队列并开启消息循环,消息队列运行在子线程中,所以将HandlerThread 中的 Looper 实例传递给 ServiceHandler,这样通过mServiceHandler 发送的消息最终都会在 HandlerThread 中执行,从而保证这个 Handler 的 handleMessage 方法运行在子线程中。

IntentService
请参考Android Service和IntentService的区别

  1. 继承自Service,它的内部封装了 HandlerThread 和Handler,可以执行耗时任务,同时因为它是一个服务,优先级比普通线程高很多,所以更适合执行一些高优先级的后台任务。
  2. HandlerThread 底层通过Looper消息队列实现的,所以它是顺序的执行每一个任务。可以通过Intent的方式开启IntentService,IntentService通过handler将每一个intent加入HandlerThread子线程中的消息队列,通过looper按顺序一个个的取出并执行,执行完成后自动结束自己,不需要开发者手动关闭。可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值