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

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()方法中要延迟才可以。 面试用:在非主线程是否可以更新UI 答:当刚启动还没有onResume的时候可以,即onCreate里面 ViewRootImp是在onResume方法中初始化的,在onCreate方法中创建线程并执行,此时还没有初始化ViewRootImp
    查看全部
  • Android中更新UI的几种方式: 1. public void activityUpdateUI(){ runOnUiThread(new Runnable() { @Override public void run() { textView.setText("Changed by Activity"); } }); } 2. public void handlerChangeUI(){ handler.post(new Runnable(){ @Override public void run() { textView.setText("OK"); } }); } 3. public void handlerChangeUI2(){ handler.sendEmptyMessage(1); } 4. view.post() public void viewUpdateUI(){ textView.post(new Runnable() { @Override public void run() { textView.setText("UI was updated by view.post"); } }); } 通过源码我们可以发现: handler使用post()去发送一个Runnable,其实它内部也是封装了Message去发送的,本质上和直接发送Message没有区别; runOnUiThread()方法会判断当前线程是不是UI线程,不是的话,则调用Activity自己的Handler对象,通过该对象发送一个Runnable;如果是,则调用UI线程的run()方法。 View的post()方法会判断 attachInfo 是否为空。如果不为空,则通过 attachInfo 的Handler对象去post一个Runnable对象。如果为空,则调用ViewRootImpl的getRunQueue去拿到一个Handler去post一个Runnable对象。 综上,更新UI的四种方法,本质上都是通过Handler机制去更新UI的。
    查看全部
  • 主线程和子线程之间的交互的实现 本例的思路: 1. 在主线程中创建两个Handler对象 handler 和 handler2(图中是threadHandler),并直接初始化 handler,而handler2 不初始化。 2. 使用 HandlerThread 创建一个子线程 thread ,并启动 thread 。 3. 初始化 handler2(使用 thread 的 getLooper()作为参数),这样一来handler2就是子线程的 Handler 对象。 4. 重写 handler 和 handler2 的 handleMessage()方法,在里面创建Message对象,并使用对方的sendMessageDelayed(message,1000);方法发送消息。 5. 定义一个Button,定义点击事件,由点击事件触发如上交互的操作。 如上操作中,第4点是核心,也就是两个 Handler 各自重写 handleMessage(),方法里面却是使用对方的 sendMessage() 方法。这样就实现了主线程和子线程的相互发送信息。 -------------- 摘自评论区,亲测有效: 取消发送,经测试,需要将UIhandler 和 threadhandler中的message的what 设置为1,取消的时候要同时removeMessage(1); 1. 子线程向主线程发送消息,必须有主线程的Handler,该Handler绑定了主线程的Looper。 2. 主线程向子线程发送消息,必须有子线程的Looper,为了防止Looper没有初始化,所以通过HandlerThread类,来保证子线程的Looper再被主线程调用时已经初始化。
    查看全部
  • HandlerThread 解决了多线程并发导致空指针的问题 为什么Handler需要和Looper关联,是因为Handler需要往Looper中的mQeueu里插入Message。所以,如果主线程需要和子线程之间通信,那有两个方法:<br> 1. 主线程拥有子线程的Handler(注意:子线程的Handler需要关联自己的Looper),通过该Handler发送消息即可。<br> 2. 主线程创建一个Handler,但是将子线程的Looper传递给Hander,这样Handler也是往子线程Looper对象的mQueue里插入msg,子线程Looper.loop自然可以拿到主线程消息了。<br> <br> 但是,这两种情况都有弊端。就是线程并发的时候,不能保证子线程的Handler或者Looper对象已经被初始化了。所以这个时候才需要用到HandlerThread 我们可以使用 HandlerThread 模拟异步任务的操作,只需要在主线程中给子线程发送消息,让子线程做耗时操作。 总之,HandlerThread可以处理耗时操作,例如下载网络图片、更新数据库等等,可以在完全不占用主线程的情况下处理比较耗时的操作。从设计的角度来看,是比较方便快捷的。 因为如果自己想要实现异步任务机制,就需要考虑一些问题,例如要开启线程、往异步任务中添加任务,任务本身还要考虑存储结构、什么时候添加任务、什么时候移除任务,以及任务如何传递、派发等等。比较麻烦。 而Android提供了HandlerThread方法,它是系统已经将任务的发送、处理等都封装好了,使用起来比较方便,我们只需调用 HandlerThread。
    查看全部
  • 如图,分别在主线程和自定义的子线程中创建 Handler 。在各自的 handlerMessage()方法中打印当前线程的id。Handler和线程是相关联的。 要在线程中创建一个 Handler,需要先创建 Looper ,创建的方法很简单:Looper.prepare(); 之后就可以创建 Handler 了。在创建 Handler 之后别忘了调用 Looper.loop(); 这样才能实现对消息的循环处理。 再次强调:不可以在主线程中做耗时操作,就比如示例里面主线程中的 handlerMessage(),不能执行耗时操作。 我们一般是在主线程中创建Handler对象,在主线程中处理Message,在子线程中调用这个Handler对象的sendMessage()来发送message。所以Handler是在哪个线程创建就有哪个线程处理Message和轮询,而由别的线程负责给这个Handler发送Message。 * 每个线程都对应一个looper,在线程里面创建的handler默认都会与这个looper对应 * 一个线程可以有多个handler与唯一的一个looper对应,有且只有一个looper * 这里主要是让我们熟悉在oncreat创建的handler与子线程创建handler * oncreate创建的handler他默认里面会有一个looper与之对应 * 所以我们自己在子线程中创建handler对象的时候我们应该要自主创建一个looper ---摘自大神
    查看全部
  • Handler原理的图解。 员工(Handler)要上厕所,需要和领导知会一下(sendMessage),领导(Looper)反馈消息( Looper.loop() )后,“上厕所”这件事还是由员工自己去解决(handleMessage)。 Looper仅仅起了传达消息的作用,而消息的发送和处理都还是由Handler自己去做。
    查看全部
  • 大神笔记: handler:工人; looper:传送带移动的动力; messagequeue:传送带; message:传送带上面的产品。 工人(handler)把自己的产品(message)放在传送带(messagequeue)尾部,在动力(looper)作用下,传送带向前移动,最终产品到达传送带头部,被取出来处理(handmessage())。
    查看全部
  • Android设计用handler机制更新UI解决了多线程并发问题。 在一个Activity中,有多个线程更新UI,并且都没有加锁机制,会导致更新界面错乱; 如果更新UI操作都进行加锁处理,则会导致性能下降。 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就是一个存储消息的容器。
    查看全部
  • Message message=handler.obtainMessage();//从Handler对象中获取Message对象,而不是自己new,这样效率高。 message.sendToTarget(); //对于从handler对象中获取的message,可以直接使用该方法发送消息。 知识拓展: 1。实例化Handler时,可以使用带一个Callback接口参数的构造函数。 其中Callback有一个未实现的方法。 这个方法有一个返回值(boolean) 2.当该Handler收到消息时,首先会调用Callback中的消息处理方法。 2.1 如果返回值为false,消息不会被截断。Handler依然可以处理该消息。 2.2 如果返回值为true,消息将会被截断。Handler中的处理消息方法不会被执行。
    查看全部
  • There are some main methords to schedule messages: post(Runnable) postAtTime(Runnable, long) postDelayed(Runnable, long) sendEmptyMessage(int) sendMessage(Message) sendMessageAtTime(Message, long) sendMessageDelayed(Message, long)
    查看全部
  • A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it . From that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue. There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; (2) to enqueue an action to be performed on a different thread than your own. When a process is created for your application, its main thread is dedicated to running a message queue that takes care of managing the top-level application objects (activities, broadcast receivers, etc) and any windows they create.
    查看全部
  • handler 是什么? 是Android提供给我们更新ui的一套机制,也是一套消息机制,我们可以发送消息,也可以通过它处理消息。 不用handler可以吗? Android在设计的时候封装了一套消息创建、传递、处理机制,如果不遵循这样的机制,就会抛出异常
    查看全部
    0 采集 收起 来源:Handler是什么

    2018-03-19

  • 为什么使用handler
    查看全部
    0 采集 收起 来源:Handler是什么

    2018-03-15

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

    2018-03-15

  • 创建子线程的handler
    查看全部

举报

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

微信扫码,参与3人拼团

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

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