一、UI的绘制过程,常见优化手段以及原理。
二、有几种常见的单例模式?对于这几种单例模式synchronized具体锁的是什么东西?
三、问内存优化你做过没有?一张十万乘以十万的图片,如何加载才不会内存溢出?
四、问内存溢出,内存抖动,内存泄漏你都碰到过吗?怎么解决的?如何区分这几种情况?怎么解决由内存泄漏而导致的内存溢出?
五、简述Rxjava的原理。
六、问Handler源码分析。
一、UI的绘制过程,常见优化手段以及原理。
(一)UI的绘制过程:
相关文章:
总结:
- (1)、在ActivityThread启动时,通过一些列的调用,首先将我们的VIew交给了WindowManager,然后调用windowManager.addView(view,layoutParams)(第一个参数是view,第二个参数是布局参数)。
- (2)、进入addView之后我们发现了一段这样的代码,他将视图,和参数还有我门的一个ViewRoot对象都用了容器去装在了起来,那么在此处我们可以得出,是将所有的相关对象保存起来。
- (3)、UI绘制先回去测量布局,然后在进行布局的摆放,当所有的布局测量摆放完毕之后,进行绘制。
UI是如何绘制的?
在ActivityThread启动时, 我发现在加载handleLaunchActivity方法调用performLaunchActivity方法之后又调用了一个handleResumeActivity在这里我发现了绘制流程的开始
通过前面的流程我门知道,onCreate之行完成之后,所有资源交给WindowManager保管
在这里,将我们的VIew交给了WindowManager,此处调用了addView
进入addView之后我们发现了一段这样的代码,他将视图,和参数还有我门的一个ViewRoot对象都用了容器去装在了起来,那么在此处我门可以得出,是将所有的相关对象保存起来
mViews保存的是View对象,DecorView
mRoots保存和顶层View关联的ViewRootImpl对象
mParams保存的是创建顶层View的layout参数。
而WindowManagerGlobal类也负责和WMS通信
而在此时,有一句关键代码root.setView,这里是将我们的参数,和视图同时交给了ViewRoot,那么这个时候我们来看下ViewRoot当中的setView干了什么
终于在这里让我发现了让我明白的一步
在这里我门会看到view.assignParent的设置是this, 那么也就是说在view当中parent其实实际上是ViewRoot
那么在setContentView当中调用了一个setLayoutParams()是调用的ViewRoot的
而在ViewRoot当中发现了setLayoutParams和preformLayout对requestLayout方法的调用
在requestLayout当中发现了对scheduleTraversals方法的调用而scheduleTraversals当中调用了doTraversal的访问,最终访问到了performTraversals(),而在这个里面,我发现了整体的绘制流程的调用
当前里面依次是用了
UI绘制先回去测量布局,然后在进行布局的摆放,当所有的布局测量摆放完毕之后,进行绘制。
至此整体UI绘制过程我们就已经非常清楚了。
我门可以根据这种绘制的流程来操作自己的自定义组件。
。。。。。结束。。。。。
(二)常见的UI优化手段以及原理:
一般来讲,布局出现问题的原因有两点:
- 一是布局层次不合理;
- 二是布局存在过度绘制;
解决方案:
- 1、使用Hierarchy Viewer工具检测
- 2、使用include 和merge标签减少复用布局而产生的布局嵌套,使用ViewStub懒加载减少渲染元素
- 3、诊断过度绘制,优化过度绘制
二、有几种常见的单例模式?对于这几种单例模式synchronized具体锁的是什么东西?
(一)所有单例模式
(1)、饿汉式
public class Singleton {
private static Singleton sInstance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return sInstance;
}
}
(2)、懒汉式
public class Singleton {
private static Singleton sInstance;
private Singleton() {
}
public synchronized static Singleton getInstance() {
if (sInstance == null) {
sInstance = new Singleton();
}
return sInstance;
}
}
(3)、双重校验锁DCL(double checked locking)
public class Singleton {
private static volatile Singleton sInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (sInstance == null) {
synchronized (Singleton.class) {
if (sInstance == null) {
sInstance = new Singleton();
}
}
}
return sInstance;
}
}
(4)、静态内部类实现的单例模式
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
private static Singleton sInstance = new Singleton();
}
}
(5)、枚举单例
public enum SingletonEnum {
INSTANCE;
public void method(){
// do something...
}
}
(二)synchronized具体锁的是什么东西?
被锁的代码块叫作临界区,只有获取到锁资源才能进入临界区,进行相应的操作。
。。。。。。。。。。
设计模式(创建型)之单例模式(Singleton Pattern)