博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android架构师必备框架技能核心笔记,面试心得体会
阅读量:2063 次
发布时间:2019-04-29

本文共 2639 字,大约阅读时间需要 8 分钟。

前言:

Android 应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的形势来看,Android开发相当火热,但是高级Android开发人才却比较少,现在移动互联网的开发者也逐步开始关注插件化技术、性能优化、行业新技术,系统架构等进阶技术。这也同时造成了一种现像,安卓开发人员感受到行业现在已经是冰火两重天的环境了,技术不全面,还停留在中低端技术水平的,辛辛苦苦写代码,为了一年涨2千块钱的工资,疯狂加班,还要被降薪,还要时刻担心被裁员,而中高级开发人员却是企业青睐的对象,工资越来越高,同时也出现了市场岗位情况是中低端开发人员多人竞争一个岗位,而中高级开发人员一人竞争多个岗位的现状。

那么作为安卓开发人员的你,该如何突破现状,成为架构师中的一员呢。

面试官:说说什么是 UI 线程?

A:就是用来刷新 UI 所在的线程嘛

面试官:多说点

A:UI 是单线程刷新的,如果多个线程可以刷新 UI 就无所谓是不是 UI 线程了,单线程的好处是,UI 框架里不需要到处上锁,做线程同步,写起来也比较简单有效

面试官:你说的这个 UI 线程,它到底是哪个线程?是主线程吗?

A:拿 Activity 来说,我们在 Activity 里异步做完耗时操作,要刷新 UI 可以调用 Activity.runOnUiThread 方法,在 UI 线程中执行,那么我们看下这个方法自然就知道 UI 线程是哪个线程了。

public final void runOnUiThread(Runnable action) {    if (Thread.currentThread() != mUiThread) {        mHandler.post(action);    } else {        action.run();    }}

这个方法会判断当前是不是在主线程,不是呢就通过 mHandler 抛到主线程去执行。 这个 mHandler 是 Activity 里的一个全局变量,在 Activity 创建的时候通过无参构造函数 new Handler() 一起创建了。

因为是无参,所以创建时用的哪个线程,Handler 里的 Looper 用的就是哪个线程了。创建 Activity 是在应用的主线程,因此 mHandler.post 去执行的线程也是主线程。 刚也说 了,runOnUiThread 方法里,先判断是不是在 UI 线程,这个 mUiThread 又是什么时候赋值的呢,答案还在 Activity 的源码里

final void attach(Context context, ...) { ...省略无关代码 mUiThread = Thread.currentThread();}

在 Activity.attach 方法里,我们把当前线程赋值给 mUiThread,那当前线程是什么线程呢,也是主线程。至于为什么创建 Activity 和 attach 都是主线程,那又是另外一个故事了 通过前面的分析,我们知道了,对于 Activity 来讲 UI 线程就是主线程

面试官:所以你的结论是 UI 线程就是主线程?

A:这是你说的,记住这个开发的时候不会错,但是不够准确。在子线程里刷新 UI 的时候会抛一个异常

ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

大意是只有最初始创建 View 层级关系的线程可以 touch view,这里指的也就是 ViewRootImpl 创建时所在的线程,严格来说这个线程不一定是主线程。这一点呢,读 View.post 方法也可以得到相同的结论。所以对于 View 来说,UI 线程就是 ViewRootImpl 创建时所在的线程,Activity 的 DecorView 对应的 ViewRootImpl 是在主线程创建的

面试官:这个 ViewRootImpl 什么时候创建

A:Activity 创建好之后,应用的主线程会调用 ActivityThread.handleResumeActivity,这个方法会把 Activity 的 DecorView 添加到 WindowManger 里,就是在这个时候创建的 ViewRootImpl

面试官:那可以在异步线程刷新 View 吗?

A:刚才我们说了,只要是 ViewRootImpl 创建的线程就可以 touch view,然后 WindowManger.addView 的时候又会去创建 ViewRootImpl,所以我们只要在子线程调用 WindowManger.addView,这个时候添加的这个 View,就只能在这个子线程刷新了,这个子线程就是这个 View 的 UI 线程了。

面试官:好,我们再聊点别的

尾声

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
以上进阶BATJ大厂学习资料可以免费分享给大家,需要完整版的朋友,。

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

roid复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

转载地址:http://iiqlf.baihongyu.com/

你可能感兴趣的文章
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【面试】一份自我介绍模板
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>
【托业】【新东方全真模拟】03~04-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST05~06-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST09~10-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST07~08-----P5~6
查看>>