面试必备之UI刷新大解密
【公众号回复“1024”,送你一个特别推送】
今天我们来了解一下线程间更新UI的几种方式, 希望在面试的时候能够帮助到你!
原文地址:https://blog.csdn.net/androidstarjack/article/details/78359821
我们都知道一般面试的时候都会问道Handler的运行机制。有些时候面试官不会直接问道。但是如果问道UI线程更新的方式有哪几种,你知道多少?
今天我们用demo来探讨一下主线程中更新的几种方式
通过简单的点击按钮来实现更新一张我女神的图片
测试效果:
首先我们要知道Handler的运行机制:
这里不再做过多的讲解。请参考
第一种方式
通过Handler发送post一个Runnable对象来实践,post源码:
post(Runnable r)—-→ sendMessageDelayed(getPostMessage(r), 0);—→sendMessageAtTime。可以看出最终是通过sendMessageDelayed方法进行发送一个对象的,。
第二种方式
第二种方式是通handler的post方法。与第一种方式大同小异。
第三种方式
这种方式我们也经常用到。其实每部也是调用的是Handler的post方法,内部代码如下:
先判断当前的线程是否为主线程,如果是当前的线程是主线程,则直接运行,是非主线程的话,调用post方法。
第四种方式
这种方式直接调用的View里面的post
View中的post源码如下:
很多人都不知道,View自己内部也封装了自己的异步处理机制,从上面就可以看出,调用的是ViewRootImpl.getRunQueue()的post方法,而在Handler内部调用post的时候,先调用的是sendMessageDelayed方法,然后调用sendMessageAtTime方法,紧接着调用enqueueMessage,最终调用的是queue.enqueueMessage,最终执行的方式都是一样的。
最终效果图点击送一个美女:
测试用例项目地址:
https://github.com/androidstarjack/MyHandlerPostUI
更多文章
相信自己,没有做不到的,只有想不到的
如果你觉得此文对您有所帮助, 欢迎加入微信公众号:终端研发部