查看原文
其他

面试必备之UI刷新大解密

2018-04-10 codoGoogler 终端研发部

【公众号回复“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

更多文章

 PK小程序,“快应用”设想很美,想要实现很难

关于Android模块化你需要知道的

知识总结 插件化学习 Hook系统方法分析

相信自己,没有做不到的,只有想不到的

如果你觉得此文对您有所帮助, 欢迎加入微信公众号:终端研发部

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存