framwork

Handler机制与原理

2021-06-01  本文已影响0人  邓立_全栈UncleLi

为什么会出现内存泄漏问题呢?

在使用Handler时,通常是通过Handler.obtainMessage()来获取Message对象的,而其内部调用的是Message.obtain()方法,那么问题来了,为什么不直接new一个Message,而是通过Message的静态方法obtain()来得到的呢?

Message的存储形式是什么

新的首部如果阻塞了,需要唤醒线程。为什么会有线程的阻塞呢?

一个线程可以有几个Looper、几个MessageQueue和几个Handler?

可以在子线程直接创建一个Handler吗?会出现什么问题,那该怎么做?

Looper死循环为什么不会导致应用卡死,会消耗大量资源吗?

-主线程的死循环一直运行是不是特别消耗CPU资源呢? 其实不然,这里就涉及到Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在Loop的queue.next()中的nativePollOnce()方法里,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。这里采用的epoll机制,是一种IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的。 所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源

Handler原理

Handler创建消息

Handler创建消息

Handler发送消息

Handler发送消息

Handler处理消息

Handler处理消息
上一篇 下一篇

猜你喜欢

热点阅读