为了账号安全,请及时绑定邮箱和手机立即绑定

Android面试常客Handler详解

难度中级
时长 2小时 0分
学习人数
综合评分9.30
169人评价 查看评价
9.7 内容实用
9.3 简洁易懂
8.9 逻辑清晰
  • 在ViewRootImpl没有实例化的时候是不会check是否是主线程,也就是说,在非UI线程中是可以更新UI的,但是为了线程安全的原因,系统会强制要求只能在主线程中更新UI(猜测)。之所以说没有太大的意义是因为实际开发中是不会有这种情况的,谷歌官方也是说了只能在UI线程更新UI,这顶多算是一个BUG吧,看不懂的朋友们知道就行了,不用深究~ 非UI线程能否更新UI --->刚启动的时候,立即在非UI线程更新->不报错。 --->休眠2s钟以后,更新——————>报错 更新UI-->会调用checkForRelayout()方法 -->invalidate()方法-->invalidate(true)方法,关注viewParent-->ViewRootImpl是ViewParent的实现类 --->p.invalidateChild()-->查看ViewRootImpl.invalidateChild()-->checkThread()方法-->判断UI线程是否是当前线程,不想等抛出异常。 ViewRootImpl是onResume()方法才会创建。所以onCreate()方法中要延迟才可以。 handleResumeActivity()方法---》viewManager.addView()-->ViewRootImpl初始化。,关注viewParent-->ViewRootImpl是ViewParent的实现类 在非UI线程中是可以更新Ui的(在onCreate中创建新线程更新UI): 当刚启动Activity即onCreate里面此时onResume方法还没有执行的时候可以,因为在线程中更新UI时会调用ViewParent.invalidateChild()方法检查当前的Thread是否是UIThread,若为UIThread则可以更新(ViewParent是一个接口类,其实现是ViewRootImpl;invalidateChild()方法调用checkThread()方法来检查线程是否为主线程)。ViewRootImp是在onResume方法中初始化的,所以只要在ViewRootImpl创建之前更新UI(在onCreate方法中创建线程并执行,此时还没有初始化ViewRootImp),就可以逃避掉checkThread()的检查进而更新UI。
    查看全部
  • 主要是在HandlerThread里面创建一个Looper,和默认的 handler 进行关联。 所有的handlerMessage()都是在子线程中调用。 我们可以使用 HandlerThread 模拟异步任务的操作,只需要在主线程中给子线程发送消息,让子线程做耗时操作。 总之,HandlerThread可以处理耗时操作,例如下载网络图片、更新数据库等等,可以在完全不占用主线程的情况下处理比较耗时的操作。从设计的角度来看,是比较方便快捷的。 因为如果自己想要实现异步任务机制,就需要考虑一些问题,例如要开启线程、往异步任务中添加任务,任务本身还要考虑存储结构、什么时候添加任务、什么时候移除任务,以及任务如何传递、派发等等。比较麻烦。 而Android提供了HandlerThread方法,它是系统已经将任务的发送、处理等都封装好了,使用起来比较方便,我们只需调用 HandlerThread。
    查看全部
  • Handler是什么? Handler是Android提供的一套用来更新UI的机制,也是一套消息处理机制,可以通过它发送消息,也可以通过它处理消息。 所有Activity生命周期回调的方法,都是通过handler机制去发送消息的,然后根据不同的消息(message)做相应的分支处理。例如发送一个消息给 Framework,告知需要调用onCreate()或onDestory()方法。实际上在 Framework 当中,Activity的交互大部分都是用AMS(Activity Manager Service)做处理的。整个应用程序的核心的一个类就是 Activity Thread,Activity Thread就是通过handler机制接收到 Activity Manager Service发送的有关Activity生命周期的管理的消息(比如启动)。 为什么要使用Handler? Android在设计的时候,就封装了一套消息的创建、传递、处理机制,如果不遵循这样的机制,就没有办法更新UI信息,并且会抛出异常信息。这样的机制便包含Handler机制。 我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。这个时候,Handler就出现了。来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传递)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。 Handler主要接受子线程发送的数据,并用此数据配合主线程更新UI。 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) ,主线程为管理界面中的UI控件,进行事件分发,比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭"。
    查看全部
    0 采集 收起 来源:Handler是什么

    2018-03-22

  • handler是android提供的用于更新UI的一套机制,也是一套用于消息处理的机制,我们可以通过它来发送和处理消息
    查看全部
    0 采集 收起 来源:Handler是什么

    2018-03-01

  • handler是android为我们提供的一套用于更新UI
    查看全部
    0 采集 收起 来源:Handler是什么

    2018-03-01

  • Handler是什么?
    查看全部
    0 采集 收起 来源:Handler是什么

    2018-01-06

  • handler handlerMessage接受信息的方法 发送信息要实现Message方法 Looper.mylooper获取一个looper looper.Loop循环looper Handler 负责发送信息 Looper 负责接受handler发送过来的信息 MessageQueue 存储信息的容器
    查看全部
  • 系统已为UI线程准备好了looper和msgqueue。 这时候用户在UI线程创建了handler对象并不会报错。 接着子线程里调用post或者send方法,实际上就是往UI线程的msgqueque对象里enqueque一条msg。 而UI线程的looper一直在loop,所以当msgqueque里新增了msg对象并触发条件满足后会调用msg里target的dispatchmsg方法。 实际上就是Handler父类的dispatchMsg方法。 紧接着handler父类再决定调用post过来的逻辑还是子类覆写的handlemsg方法。
    查看全部
  • post 不用实现handlemsg 适用于简单的处理逻辑的场合 使用场景较少 sendmsg 需要实现handlemsg 适用于需要传递线程间数据进行处理的场合 使用场景较多
    查看全部
  • handler,looper,messagequeue,message,thread.学习了解之间关系,知道函数及使用
    查看全部
    0 采集 收起 来源:课程内容介绍

    2017-11-28

  • handler
    查看全部
    0 采集 收起 来源:课程内容介绍

    2017-11-27

  • handler
    查看全部
    0 采集 收起 来源:课程内容介绍

    2017-11-11

  • handler、looper、messagequeue、message四者可以这样理解: handler:工人; looper:传送带移动的动力; messagequeue:传送带; message:传送带上面的产品。 工人(handler)把自己的产品(message)放在传送带(messagequeue)尾部,在动力(looper)作用下,传送带向前移动,最终产品到达传送带头部,被取出来处理(handmessage())。 ----------------- 先要有个概念。 1、handler 消息处理器,负责处理消息。 2、Message 消息,包含消息id,被处理的对象。 3、MessageQueue 消息队列,存放Handler发送过来的Message 4、looper 消息泵,不间断的从MessageQueue消息队列中抽取消息。 简单的比喻looper就是水泵,MessageQueue储水的池塘,Message就是水,Handler就是操作的人。
    查看全部
  • 以下内容来自大神笔记: handler、looper、messagequeue、message四者可以这样理解: handler:工人; looper:传送带移动的动力; messagequeue:传送带; message:传送带上面的产品。 工人(handler)把自己的产品(message)放在传送带(messagequeue)尾部,在动力(looper)作用下,传送带向前移动,最终产品到达传送带头部,被取出来处理(handmessage())。 ----------------- 先要有个概念。 1、handler 消息处理器,负责处理消息。 2、Message 消息,包含消息id,被处理的对象。 3、MessageQueue 消息队列,存放Handler发送过来的Message 4、looper 消息泵,不间断的从MessageQueue消息队列中抽取消息。 简单的比喻looper就是水泵,MessageQueue储水的池塘,Message就是水,Handler就是操作的人。
    查看全部
  • Handler的原理是什么? 面试经典问题:Looper、Handler、Message(或MessageQueue)三者间的关系? 一、Handler封装了消息的发送(主要是将消息发送给谁(默认是Handler自己),以及什么时候发送)。 Looper: 1.内部包含一个消息队列 MessageQueue,所有的 Handler 发送的消息都走向(加入)这个消息队列。 2.Looper.Looper方法,就是一个死循环,不断地从 MessageQueue 取得消息,如果有消息就处理消息,没有消息就阻塞。 二、MessageQueue MessageQueue 就是一个消息队列,可以添加消息,并处理消息。 三、Handler 也很简单,内部会跟 Looper 进行关联,也就是说,在 Handler 的内部可以找到 Looper,找到了 Looper 也就找到了 Message。在 Handler 中发送消息,其实就是向 MessageQueue 队列中发送消息。 总结:Handler 负责发送消息,Looper 负责接收 Handler 发送的消息,并直接把消息回传给 Handler 自己,MessageQueue就是一个存储消息的容器。
    查看全部

举报

0/150
提交
取消
老师告诉你能学到什么?
通过本课程,你将学到: 1、什么是Handler 2、如何使用Handler 3、Handler的原理是什么 4、如何定义一个与线程相关的Handler 5、Android更新UI的几种方式 6、非UI线程真的不能更新UI吗 7、Handler使用过程中遇到的问题

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!