很久前我们提问过:
每日一问 在Activity 的 onResume 方法中 view.postRunnable 能获取到 View 宽高吗?
相信大家对于View.post都比较熟悉了,有个API与之非常类似:
- View.postOnAnimation 与View.post相比有什么区别?
- 在什么情况下比较适合使用View.postOnAnimation呢?
更多问答 >>
-
大家提问 Android中前后台切换监听,如果涉及到多进程如何完美的解决?
2022-12-04 22:50 -
2022-11-08 21:50
-
2022-11-08 21:50
-
每日一问 | App在运行状态,可以动态安装apk,并且不重新启动吗?
2022-11-20 12:46 -
每日一问 | 瘦身属性?对android:extractNativeLibs属性的探讨
2022-12-07 14:43 -
【大家提问】Android中的匿名binder与线程相关的一些问题
2022-07-03 10:48 -
2022-06-12 14:41
-
2022-05-27 20:55
-
每日一问 | Service onStartCommand 返回STICKY是如何做到被拉活的?
2022-07-24 11:50 -
2022-05-06 11:37
post()会将runnable对象放在队列中等待执行。 postOnAnimation()方法会在下一帧立即执行runnable对象
知乎
View.post 和 View.postOnAnimation 是 Android 中的两个方法,它们都可以用来在 View 上执行一个 Runnable。
两者之间的主要区别在于,View.postOnAnimation 会在下一次界面重绘时执行 Runnable,而 View.post 则会在下一个消息事件循环时执行 Runnable。因此,如果您希望在下一次界面重绘时执行一个任务,则应使用 View.postOnAnimation,否则应使用 View.post。
此外,View.postOnAnimation 还可以提供更高的帧率,因为它会与界面重绘同步运行,而 View.post 则会在下一个消息事件循环中执行,因此帧率可能不高。
举个例子,如果您希望在下一帧中执行一个任务,则可以使用 View.postOnAnimation。例如,您可以使用 View.postOnAnimation 来更新一个动画,而使用 View.post 则不太适用。
总的来说,在执行动画或与界面重绘同步运行的任务时,应使用 View.postOnAnimation;在执行其他任务时,则可以使用 View.post。
主线程基本处理流程:Choreographer.FrameHandler.handleMessage => MSG_DO_FRAME => doFrame=> doCallbacks(CALLBACK_INPUT、CALLBACK_ANIMATION、CALLBACK_INSETS_ANIMATION、CALLBACK_TRAVERSAL、CALLBACK_COMMIT)
消息入队列:postOnAnimation => postCallbackDelayed(CALLBACK_ANIMATION) => mCallbackQueues[callbackType].addCallbackLocked => setAsynchronous(true)mCallbackQueues优先执行CALLBACK_ANIMATION的类型回调,同时优先级队列Asynchronous机制保证在vsync机制里,先于performTraversals方法。view.post 会塞到主线程消息队列最后
view.post() 正常的向 Looper 中加入一条 Msg,遵守 Handler 消息执行逻辑。
view.postOnAnimation,向 Choreographer 中添加 CALLBACK_ANIMATION 类型的回调,该回调会在Choreographer 的一条异步消息中执行,在 VSYNC 信号到来时即会执行,即下一帧绘制之前就会执行,而 view.post() 提交的消息要比view.postOnAnimation延后一点执行。
另外,View.post() 有返回值,View.postOnAnimation() 没有