android-View.post与Handler.post的区别
2017-07-04 10:49
459 查看
View.postDelayed
package android.view; public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource { public boolean postDelayed(Runnable action, long delayMillis) { final AttachInfo attachInfo = mAttachInfo; if (attachInfo != null) { return attachInfo.mHandler.postDelayed(action, delayMillis); } // Postpone the runnable until we know on which thread it needs to run. // Assume that the runnable will be successfully placed after attach. getRunQueue().postDelayed(action, delayMillis); return true; } }
Handler.postDelayed
package android.os; public class Handler { public final boolean postDelayed(Runnable r, long delayMillis) { return sendMessageDelayed(getPostMessage(r), delayMillis); } }
View.postDelayed与Handler.postDelayed的区别
当View已经attach到了window,两者是没有区别的,都是调用UI线程的Handler发送runnable到MessageQueue,最后都是由handler进行消息的分发处理。但是如果View尚未attach到window的话,runnable被放到了ViewRootImpl#RunQueue中,最终也会被处理,但不是通过MessageQueue。
当视图树尚未attach到window的时候,整个视图树是没有Handler的(其实自己可以new,这里指的handler是AttachInfo里的),这时候用RunQueue来实现延迟执行runnable任务,并且runnable最终不会被加入到MessageQueue里,也不会被Looper执行,而是等到ViewRootImpl的下一个performTraversals时候,把RunQueue里的所有runnable都拿出来并执行,接着清空RunQueue。
由此可见RunQueue的作用类似于MessageQueue,只不过,这里面的所有
runnable最后的执行时机,是在下一个performTraversals到来的时候,MessageQueue里的消息处理的则是下一次loop到来的时候。
参考:
View#post与Handler#post的区别,以及导致的内存泄漏分析相关文章推荐
- android多线程handler+runOnUithread+view.post+handler.post
- Android多线程之handler+runOnUithread+view.post+handler.post
- android多线程handler+runOnUithread+view.post+handler.post 2013-
- runOnUiThread 、Handler.post、View.post之间的区别
- Android从源码分析handler.post(runnable),view.post(runnable),runOnUiThread(runnable)执行时机
- android handler.post和handler.sendMessage的区别和联系
- [android小知识]removeCallbacks与postDelayed的恩怨史(removeCallbacks所谓的无效, View和Handler 的postDelayed)
- android多线程handler+runOnUithread+view.post+handler.post
- Android开发中更新UI时runOnUIthread(Runnable)与Handler.post(Runnable)的区别及如何选择
- android中Invalidate和postInvalidate的区别Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI
- 关于Handler.post与View.post的区别
- Android中Handler的post和sendMessage的区别
- Handler.post与View.post的区别
- android中handler.sendMessage,handler.post(r)的用法与区别
- (转)Android开发:Invalidate和postInvalidate刷新View的区别
- [杂谈]关于Handler.post与View.post的区别
- android中view.post和handle.post的区别
- android Matrix.setRotate 和 postRotate的区别
- AndroidView与SurfaceView的区别
- Android surfaceView 与View 的区别