StrorageBox

StrorageBox

V2EX 第 505832 号会员,加入于 2020-08-28 21:54:20 +08:00
根据 StrorageBox 的设置,主题列表被隐藏
二手交易 相关的信息,包括已关闭的交易,不会被隐藏
StrorageBox 最近回复了
31 天前
回复了 StuPYX 创建的主题 职场话题 就业形势有感
看看最高赞就知道,这楼里坏 B 太多了,你还想讨论问题?问就是人多
我说句实话,我们小区招保安月薪 4000 ,年龄不限
44 天前
回复了 wxlwsy 创建的主题 电动汽车 最近看新能源车有感
@Ne
@ttentau1
感谢,今天刚去 byd 店里,差点被洗脑了
加油
48 天前
回复了 ElmerZhang 创建的主题 职场话题 你能接受平薪甚至降薪跳槽吗?
再送你个 dribbble,哈哈哈哈哈
48 天前
回复了 ElmerZhang 创建的主题 职场话题 你能接受平薪甚至降薪跳槽吗?
你甚至连 double 都拼错了
*你*的,想卖信息别带上别人,*了个*的,op 这种人不是*就是坏,*的就是你这种人
你随便买个云服务不比这香?
你是想说的 block 机制吧


looper.loop()方法中开始循环调用 loopOnce()方法
loopOnce()调用,messageQueue.next()方法,这方法是会被 block 的。

- block 的原因呢
有两种,其 1 是消息队列是空的,其 2 是开启了同步屏障,而消息队列中没有异步消息。

- 解除 block 的原理也是这样,在 messageQueue.enqueueMessage() 中 1.添加新消息,2.添加异步消息(异步消息有两种添加方式,你可以从源码去了解一下)

- 解除 block 的方法或者叫唤醒的方法,走 native wake(),本质上呢是通过 pipe 向指定 fd 进行写入一个 char(代码在 native Looper 中 ,同时可以了解一下 pipe 的原理)

- 写入之后发生了什么,在 messageQueue.next()中首先调用 nativePollOnce()进入到 native Looper.poll_once(),进入到 native Looper.poll_inner() ,里面就能看到通过 epoll 去监听 fd 了(除了上面的指定 fd ,还含有多个 request 对应的 fd),如果有写入,就会有监听结果返回,Done 之后,block 便解除了。

这个过程细节很多,感兴趣可以了解一下 epoll ,select/poll ,requst/response queue ,native handler 。

结果就是,在 block 的时候,其实是有 epoll 去监听的。wake 之后就继续执行了。无限循环是为了保证线程不被结束,和 anr 是没有关系的。

谈到 anr ,还是要重新理解一下概念。anr 发生的根本原因,不是线程什么都不做,而是 dispatchMessage()的执行时间,确切的说是上一个 message 的 disptch 时间过长导致现在的 message 不能被及时处理。

我们看看 google 的定义"ANR 是一个问题,因为负责更新界面的应用主线程无法处理用户输入事件或绘制操作,引起用户的不满"。我觉得这个定义虽然没有把所有发生 anr 的情况罗列出来,但是很好的表达了 anr 的目的。

回到你的描述上,为什么不卡屏幕刷新。作为应用程序的屏幕刷新时机有两种,1.requestlayout 刷新,2.重绘刷新,这两种刷新的原理都是通过 Choreographer 发送异步消息(在 Choreographer 就能看到两种异步消息的添加方式了)。

纯手打,可能有些函数名有点出入。


那么问题来了,屏幕上的图像到底是谁绘制的?
关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4443 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 10ms · UTC 02:33 · PVG 10:33 · LAX 19:33 · JFK 22:33
Developed with CodeLauncher
♥ Do have faith in what you're doing.