2019最全Android面试题总结-答案解读(持续更新中。。。)

视图相关

系统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:View的三次measure,两次layout和一次draw

  • 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学习之旅

  • 基于AIDL的 Activity、Service跨进程观察者模式实现与源码解读
  • 走进源码,Android面试最常见Handler、Looper、Message问题总结与解答
  • Android面试—ListView原理及fling分析
  • 5分钟告诉你,Activity的视图绘制流程(onMeasure、onLayout、onDraw的调用和参数解释)
  • 2019最全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主线程为什么不阻塞

Android中为什么主线程不会因为Looper.loop()里的死循环阻塞?

  • ThreadLocal
    ThreadLocal为什么要设计成private static

参考

厘米姑娘的 文章汇总|学习Android的一点一滴
Android 开发面试 “68” 问

你可能感兴趣的:(Android面试)