Android中的Handler和AsyncTask的区别

问题的由来

最近老看见有人问Android中的Thread与AsyncTask的区别,因此研究了一下,总结如下。
第一,如果真心想弄清楚这两个的具体用法,最好的方法是把Message、MessageQueue、Looper、Handler、HandlerThread和AsyncTask这六个类的源代码全部看懂。
第二,如果觉得困难,那么就来看看我的这篇总结文章吧。

Handler类,可以理解为消息/任务处理者,Handler类是为了与其他几个类一起完成Android的消息循环处理过程,是必不可少的一个类。它主要有两个用途:一是为了在将来某个时间点处理一个消息或者执行一个任务;二是将一个任务放入队列,以便它可以在另外的线程中执行。

AsyncTask类,可以理解为异步任务执行者;这个类的设计目的很明确,就是为了“执行一个较为耗时的异步任务(最多几秒钟),然后更新界面”。这种需求本可以使用Handler和Thread来实现,但由于编码较为复杂,因此Android提供了AsyncTask类。

几个规则

正式开始讨论Handler和AsyncTask之前,有几个Android的规则要再强调一次:

  1. 只能在UI线程中访问界面;
  2. UI线程被阻塞(大概5秒钟)后会导致ANR(Application Not Responding)错误。

因此我们要使用Handler来创建消息循环,或者使用AsyncTask来创建异步任务来进行操作。

Handler类的使用场景

消息循环三兄弟Handler、Looper和HandlerThread

Handler用来和Looper、HandlerThread一起建立一个具有消息循环的子线程。如果这三个类中有一个你不理解,那么你三个都不会理解,也不会理解Android的消息循环与处理机制。

Looper环形使者(顺便说一下这个电影很好看):Looper中带有一个MessageQueue,即消息队列,Looper负责轮询此消息队列,将消息取出后交由Handler来处理。
HandlerThread消息循环线程:即Handler执行的线程,此线程大部分时间都在运行Looper.loop()方法,即消息轮询方法;它会通过getLooper方法返回一个Looper对象,Handler需要使用此对象作为参数创建对象。
Handler处理者:负责接收消息、发送消息(sendMessage等方法)和处理消息(handleMessage方法),我们需要重载handleMessage方法来处理各种消息。

一个具有完整消息循环的线程必然包括Looper、Handler和HandlerThread对象(或者你自己用Thread类来写一个线程),其中Looper对象内部还包含一个MessageQueue对象,我们这样来建立一个消息循环子线程。

   Looper anotherLooper ;
   AnotherHandler anotherHandler;
   HandlerThread handlerThread;
   
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值