View的绘制流程及事件分发
1、view绘制机制
measure()–>onMeasure(); layout()–>onLayout(); draw():
2、view事件分发机制:
主要由3个函数组成:
dispatchTouchEvent():进行事件分发;
onInterceptTouchEvent():用于事件拦截;
onTouchEvent():处理具体的事件,类似于OnTouchListener、OnClickListener
3、Activity跟Window之间的关系
1)每一个Activity中都包含一个Window对象,在Android中Window对象通常是由PhoneWindow来实现的。PhoneWindow将DecoreView设置为整个应用窗口的根View,DecoreView作为窗口界面的顶层视图,封装了一些窗口操作的基本方法。将要显示的内容呈现在PhoneWindow上,我们的View的监听事件都是由WindowMangerService来进行接收,并且通过Activity的对象来回调相应的onClickListener。在显示上,DecorView将屏幕分成两个部分:一个是titleView,另一个是ContentView。
2)Activity在onCreate时调用attach方法,在attach方法中会创建window对象。window对象创建时并没有创建 DocerView 对象。用户在Activity中调用setContentView,然后调用window的setContentView,这时会检查DecorView是否存在,如果不存在则创建DecorView对象,然后把用户自己的 View 添加到 DecorView 中。在Activity中的onCreate 方法中调用 setContentView,界面绘制并不是由 Activity 完成的,实际上是调用Window对象的 setContentView,所以说界面绘制全部是由Window类的实现类(PhoneWindow类)来完成的。
4、ANR在四大组件中的时间,场景
大致可以对应到android四大组件中的三个(Activity、BroadcastReceiver和service)
1)KeyDispatchTiemout :最常见的一种类型,原因是View的按键事件或者触摸事件在特定的时间(5秒)内无法得到响应。
2)BroadcastTimeout: 原因是BroadcastReceiver的onReceive()函数运行在主线程中,在特定的时间按(10秒)内无法完成处理。
3)ServiceTiemout : 比较少出现的一种类型,原因是Service的各个生命周期函数在特定时间(20秒)内完成处理。
场景:
1)应用程序UI线程存在耗时操作,例如在UI线程中进行网络请求、数据库操作或者文件操作,可能会导致UI线程无法及时处理用户输入等。当然在Android4.0之后,如果在UI线程中进行网络操作,将会抛出NetworkOnMainThreadException异常。
2)应用程序的UI线程等待子线程释放某个锁,从而无法处理用户的输入。
3)耗时的动画需要大量的计算工作,可能导致CPU负载过量
5、OOM(内存泄露),如何避免
1)加载对象过大。
2)相应资源过多,来不及加载。
解决这些问题,有:
1)内存引用上做一些处理,常用的有软引用。
2)内存中加载图片直接在内存中做处理(如边界压缩)
这个Glide\Fresco 图片框架可能封装好了
3)动态回收内存
4)优化Delivk虚拟机的堆内存分配
5)自定义堆内存大小
6、抽象类跟接口的区别,接口的默认修饰符 ?
1)在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,提高代码的可重用性,这是抽象类的优势所在;而接口中只能包含抽象的方法。
2)由于抽象类中允许加入具体的方法(即非抽象方法),因此扩展抽象类的功能,即向抽象类中添加一个具体的方法,不会对它的子类造成影响。而对于接口,一旦接口被公布,就必须非常稳定,因为随意在接口中添加抽象方法,会影响到所有的实现类,这些实现类要么实现新增的抽象方法,要么声明为抽象类。
3)一个类只能继承一个直接的父类,这个父类有可能是抽象类;但一个类可以实现多个接口,这是接口的优势所在。
java接口默认就是abstract的。
java接口本身默认是abstract的;可以是public的,也可以是friendly的,但不可以是private 的,不可以是protected的(否则通不过编译)。
java接口里的方法默认是abstract的,public 的;不可以private 的,不可以是protected 的。