你怎么知道View.post()是不可靠的

你怎么知道View.post()是不可靠的
一、前言

有时候,我们需要使用View.post()发送一个可运行于主线程执行方法。这一切似乎是美丽的,它最终将通过handler.post执行()方法和避免重新定义一个对象。

然而,从Android 7(API Level 24),View.post()将不再是那么可靠。运行后(你)永远不会有机会执行。

7中两个岗位的区别

2.1种方法的差异

正如前面提到的,这个问题只有在Android 7中出现,那么我们首先分析什么变化View.post()在Android 7的源代码。
看看不同的分歧,左边是API级别24 +代码(以下简称api24),和右边的API级别23(以下简称api23)代码。

显而易见,执行的逻辑是不同的只有mattachinfo是空的。

在api24,我们称getrunqueue(),后(动作),和api23电话viewrootimpl.getrunqueue()后(行动)的方法。他们的区别在这里。

2.2 api23后细节

让我们用一个简单的ViewRootImpl是了解的开始。

viewrootimpl可以理解为一个活动viewtree根节点的一个实例。每个viewrootimpl用于管理decorview和ViewTree。

队列进行srunqueues运行在ViewRootImpl,这是一个静态变量。也就是说,在应用程序的生命周期,在ViewRootImpl消息队列是一样的。

在viewrootimpl.getrunqueue一看()后()以上。
后()方法简单地把它变成一个handleraction对象并将它放进mactions ArrayList。继续追踪需要知道当handleraction添加在mactions消耗。

地方handleraction消耗是executeactions()方法。
它最终要求的handler.postdelayed(),也就是说。关键的一点是当executeaction()方法调用。

executeaction()被调用dotraversa traversalrunnable(),在dotraversa()方法,通过traversalrunnable叫做Choreographer.postCallBack()。编导通过doschedulecallback发送msg_do_schedule_callback型消息循环(),并且间隔一个垂直同步间隔。

关于编舞,这不是本文的重点。对它有一个单独的了解是很有趣的。

所以,在api23,executeaction()将骑自行车。基本上,里面的mactions将消耗只要有运行,不执行。

所以在设备下面api23,View.post()基本上是可靠的,并运行出来后将有机会执行它。

2.3 api24细节

看看api24实施细则。在api24,的getrunqueue(),后()方法被调用时,它运行在一个handleractionqueue对象。
内部结构实际上是api23非常相似,并保持handleraction mactions数组。

地方mactions最终消耗仍然是一个executeactions()方法。
回到最基本的问题,当executeactions()方法,当机会来继续追踪,我们可以看到View.dispatchAttachedToWindow()方法调用。
由于executeactions()在api24和上面的方法,只在dispatchattachedtowindow()方法,有机会被称为,和View.dispatchAttachedToWindow()方法,只在视图中通过addView()方法被添加到一个ViewGroup,就会叫。这导致控制写在布局没有机会叫addView()方法了,所以它不会被执行。这就是为什么View.post现象()性能不符合api24。

三、总结

View.post之间的差异的根本原因()方法和不同的版本,executeactions呼叫时间()方法是在api23和api24不同,从而产生不同的视图的性能时,有没有mattachinfo对象。

所以我们在使用过程中要小心使用,区分现场的实际使用情况,一般规范自己的代码即可:

观后已经显示,View.post()方法被称为(此时mattachinfo不是空的)。
尽量避免使用View.post()方法,可以直接与Handler.post()方法。

总结

以上是view.post()这是不可靠的你。我希望它会对你有帮助。如果你有任何问题,请给我留言。萧边会及时回复你。谢谢你的支持网站
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部