一、前言
有时候,我们需要使用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()这是不可靠的你。我希望它会对你有帮助。如果你有任何问题,请给我留言。萧边会及时回复你。谢谢你的
支持网站。