android面试题相关

1. Dalvik 和 ART 的区别?
  • Dalvik 每次运行都需要把字节码即时编译成机器码(JIT);ART 会在安装时把字节码预编译成机器码,使其成为真正的本地应用。
  • ART 占用空间比Dalvik 大,大约(10%~20%),用空间换时间。
  • ART 不用每次运行都重新编译(AOT),减少cpu使用频率,降低能耗。

JVM 基于栈,Dalvik 基于寄存器。

.dex文件–>AOT预编译–>.oat文件–>在ART上运行

2. Bitmap 优化?

通过BitmapFactory.options

  • inPreferredConfig 设置图片解码后的格式,如ARGB_8888 和 RGB_565。其中ARGB_8888 是8+8+8+8=32,一个像素占用 4 个字节。RGB_565 是 5+6+5=16,一个像素占用 2 个字节。
  • inSimpleSize 设置图片的采样率进行图片的缩放显示。如值为 2 ,表示长宽均为原来的 1/2,整个图片占用内存的面积为原来的 1/4。inSimpleSize 只能设置为 2 的幂

三级缓存?

内存缓存–>本地缓存–>网络获取 另外要注意 Bitmap 的复用问题。

3. Bundle 用来传递数据,为什么不用 HashMap取代?

Bundle 内部用的 ArrayMap,这其实用ArrayMap和HashMap 的比较。

  • ArrayMap 适合在小数据量时操作,数据量大时性能会退化;HashMap 使用数组+链表,在数据量少的时候Entry[] 会占用更大的内存。而bundle 场景是小数据量。
  • 使用 intent携带数据的话,需要的基本类型和序列化类型。bundle 使用 Parcelable,HashMap 是使用 Serializable。
4. 广播和EventBus的区别?
  • 广播是四大组件之一,EventBus是开源框架;
  • 广播不能执行耗时操作,超过10s会ANR;
  • 广播耗资源,EventBus比较轻量;
  • 广播容易获取Context和intent;
  • EventBus切换线程方便;
  • 广播可以跨进程, EventBus不可以;
5. 什么是 SurfaceView?
  • 子线程绘制

是View的子类,是一个专门用来做频繁绘制的View的子类,它的绘制操作是在子线程中进行的,所以频繁绘制不会造成阻塞线程,用于处理频繁绘制和长时间绘制效果好。如相机,游戏,视频。

子线程涉及到事件同步问题,需要有一个event queue来保存touch event,类似handler。

  • 双缓冲模式

一个后台缓冲区,一个前台缓冲区。本质就是后台线程绘制,UI线程渲染。

6. 什么是Activity,Window,view?
  • Activity 是四大组件之一,存放view的容器;
  • Window是一个抽象类,PhoneWindow是实现类,Activity的setContentView 实际上是调用的PhoneWindow的方法;
  • View 是一个视图对象;

大概的包含关系:Activity–>PhoneWindow–>DecorView–>TitleView + ContentView

7. ClassLoader 原理是什么?

java类加载器有下面几种:

  • BootClassLoader 用于加载Android Framework 层 class 文件。
  • PathClassLoader 用于 android 应用程序类加载器。可以加载指定的dex、以及 jar、zip、apk 中的 classes.dex。
  • DexClassLoader 加载指定的dex、以及 jar、zip、apk 中的 classes.dex。跟上面的区别只是构造参数不同,多了一个dex优化之后的路径。

双亲委托机制:

​ 某个类加载器在加载类时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务或者没有父类加载器时,才自己去加载。

8. Java 的回收机制?如何减少oom?

GC判断对象的存活是通过可达性分析算法来进行。

在java中,可作为GC Roots的对象包括:

  • 方法区:类静态属性的对象;
  • 方法区: 常量的对象;
  • 虚拟机栈中的对象;
  • 本地方法栈 JNI 中的对象;

Java回收机制如何减少oom的概率?

  1. 尽可能少的发生内存泄漏;
  2. 尽可能不在循环内申请内存;
  3. 尽可能不在调用次数多的函数中申请内存;
9. 什么是ANR?如何避免ANR?

App长时间无响应,就叫ANR。

  • 前台服务,超时时间为 20s;
  • 后台服务,超时时间为 200s;
  • 前台广播,超时时间为 10s;
  • 后台广播,超时时间为 60s;
  • ContentProvider,超时时间为 10s;
  • 输入事件分发,超时时间为 5s;

如何避免ANR发生?

  1. 主线程避免耗时操作。比如过度复杂的 UI 绘制,网络操作,文件 IO 操作;
  2. 避免主线程跟工作线程发生锁的竞争,减少系统耗时 Binder 的调用,谨慎使用 sharePreference,注意主线程执行 provider query 操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值