视图相关
系统View组件
- ListView
- Q:ListView为什么可以加载1000个条目不崩?
- Q:什么是RecycleBin,它是怎么和ListView回收和复用的?
- Q:你知道notifyDataSetChanged方法干了啥吗?调用之后为啥ListView就刷新了?
- Q:你知道ListView的跟手滑动和fling是怎么实现的吗?
- 考察知识点:ListView源码、设计模式
- 思路:这其实是考察是否看过ListView的源码,对于适配器模式、观察者模式是否有自己的见解。
- 参考答案:详见我这篇文章Android面试—ListView原理及fling分析
- ScrollView
- Q:ScrollView的测量过程,滑动过程以及fling的实现?
- FrameLayout
- Q:FrameLayout的布局过程?
- LinearLayout
- Q:LinearLayout的布局过程?
- RecyclerView
- CoordinatorLayout(协同布局)
- ConstraintLayout(约束布局)
测量
-
Q:onMeasure里面的MeasureSpec哪里来的?它的数据结构怎么样?怎么用?
- 考察知识点:测量流程、自定义View
- 思路:这题其实就是考察是否熟悉绘制流程的源码,我在5分钟告诉你,Activity的视图绘制流程(onMeasure、onLayout、onDraw的调用和参数解释)文章中讲过。
- 参考回答:MeasureSpec在刚爷的书里面讲的很细,onMeasure中的MeasureSpec是由父布局的onMeasure方法中的measureChild调用,其中的MeasureSpec是由父布局的MeasureSpec和子布局的layoutParams共同决定的,由size和mode组成,是一个32位的int值,其中前2位是mode,后30位是size,主要提供getSize()和getMode()方法,其中mode有Unspecified、exactly、at_most几种类型。
绘制相关
- Q:什么是SurfaceFlinger FrameBuffer Surface ?
- Q:为什么我们说主线程的操作不要操作16ms?
- Q:什么是VSYNC(垂直同步)、格栅化?
- Q:什么是掉帧jank,怎么处理?(双缓冲和三缓存机制)
设计模式
- 依赖注入
- 代理模式与动态代理
- 观察者模式
ps
这篇是上篇2019最全Android面试题总结(持续更新中。。。)的答案,上篇主要是题目总结。
完整Android学习路径 请戳我的Android学习之旅
Java
- 1.抽象类和接口
首先抽象类可以带方法实现,抽象类不能被实例化,抽象类的抽象方法必须被实现。而接口声明的一组方法必须被重写。聚个例子,车里面有汽车和自行车,它们都有一个行为就是可以跑,所以我们可以理解车就是一个抽象类,但是单独说车的话是没有这个东西的,所以说车不能被实例化。所以汽车和自行车都是属于一个类别的物体,那就是车。而它们都有共同的行为,那就是跑,所以接口更像是行为的描述,抽象类更像是类别的描述。
- 2.内部类的作用
内部类分为局部内部类、成员内部类,静态内部类,匿名内部类。内部类不能直接被外部访问(除了public的静态内部类)
- 3.Java 虚拟机的特性
平台无关性,Java代码会编译成为字节码,只要有JVM就能执行。
- 4.string、stringbuffer、stringbuilder区别
String是不可变的,在JVM中存放于常量池,String拼接实际上是把2个String生成新的String常量,然后把指针指向这个新对象,所以会存放很多无用常量在方法区,这篇文章有讲方法区的回收算法,而如果我们使用StringBuilder对象append字符和字符串就会减少很多中间字符串常量的产生,StringBuilder和StringBuffer的区别是StringBuffer是线程安全的。
public synchronized StringBuffer append(boolean b) {
toStringCache = null;
super.append(b);
return this;
}
- 5.什么导致线程阻塞
阻塞:暂停一个线程的执行以等待某个条件发生。Java 提供了大量方法来支持阻塞,比如Sleep: 原理发送一个linux alarm()设定报警时间,再通过sigsuspend()将进程挂起在信号SIGALARM,当报警时间到了,唤醒线程。
suspend() 和 resume) 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。
- Android主线程为什么不阻塞
- ThreadLocal
ThreadLocal为什么要设计成private static