• 异步消息处理机制相关面试问题-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的弱引用。

  • 相关阅读:
    获取键盘代码
    从一道js笔试题到==运算符的简析
    【物联网智能网关01】通过AD采集获取温湿度
    【物联网智能网关04】WinForm for .NET MF 功能一览
    .NET Micro Framework V4.2 RTM正式发布
    【物联网智能网关02】获取摄像头数据+显示
    .NET Micro Framework开发板用户简明手册(v3.0)
    2011 ARM技术研讨会杂记
    再谈.NET Micro Framework移植
    【.Net MF网络开发板研究06】以太网转串口
  • 原文地址:https://www.cnblogs.com/webor2006/p/8971466.html
Copyright © 2020-2023  润新知