zoukankan      html  css  js  c++  java
  • 异步消息处理机制相关面试问题-handler面试问题详解

    什么是handler?

     这个异常应该也就是引出handler的原因,也就是默认在非UI线程中是无法去更新UI的东东滴,那到底什么上handler呢?

    handler通过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue。

    1、可以让对应的Message和Runnable在未来的某个时间点进行相应处理。

    2、让自己想要处理的耗时操作放在子线程,让更新UI的操作放在主线程。

    handler的使用方法:

    • post(runnable)
      查看一下代码其实它也是调了用sendMessage(),如下:
    • sendMessage(message)

    handler机制的原理:

    先来看一下图:

    从源码角度来分析,先来看一下handler()的构造函数会来创建一个looper:

    然后还创建了MessageQueue:

    可以发现MessageQueue是在Looper里面创建的,那Looper是如何创建的呢?

    是通过ThreadLocal来获取的,也就是不同的线程获取各自的Looper,那何时将Looper对象放到ThreadLocal当中的呢?

    此时Handler就持有的MessageQueue,而MessageQueue又是在Looper当中创建的,这样这三者就有机的关连起来了。

    接着Looper需要调用loop()方法从MessageQueue去获取消息并处理,具体看下源码:

    而msg.target中的tartget又是个什么东东呢?

    哦~~原来就是Handler,接着再来看一下它的dispatchMessage()方法:

    而像Msg.obtain()方法就是用callback的形式,至此整个handler消息处理过程就已经完整分析了,下面再来用图回顾一下:

    handler引起的内存泄漏以及解决办法:

     

    解决方法:

    ①、可以将handler声明为静态内部类,如下:

    ②、也可以在Activity中的onDestroy()中调用如下方法:

    ③、让handler内部持有外部Activity的弱引用。

  • 相关阅读:
    HDU 3401 Trade
    POJ 1151 Atlantis
    HDU 3415 Max Sum of MaxKsubsequence
    HDU 4234 Moving Points
    HDU 4258 Covered Walkway
    HDU 4391 Paint The Wall
    HDU 1199 Color the Ball
    HDU 4374 One hundred layer
    HDU 3507 Print Article
    GCC特性之__init修饰解析 kasalyn的专栏 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/webor2006/p/8971466.html
Copyright © 2011-2022 走看看