Android 面试小知识合集1

本文详细介绍了Android中的关键技术,如Livedata的生命周期感知和观察者模式,视图的绘制流程,事件分发机制,以及Handler通信和RecyclerView的缓存策略,帮助开发者深入理解Android应用开发的底层原理。
摘要由CSDN通过智能技术生成
1.Livedata 的原理
具备生命周期的感知能力(LifeCyclerOwner(Activity Fragment Service))和观察能力(用
观察者实现数据变化的通知),即当观察者生命周期处于活跃状态能感知到数据的变化,一般和
ViewModel组件进行连用
例:
MutableLiveData liveData=new MutableLiveData();
liveData.observe(lifecycleOwner,new Observer(){
 void onChaned();
});
liveData.setValue(new UserEntity()); / liveData.postValue(new UserEntity());
1、在observe方法中将lifecycleOwner及观察者(Observer)封装到一个包装类里面
(LifecycleBoundObserver)然后将其缓存到Map中(为了复用提升性能)
2、owner.getLifecycle().addObserver(wrapper);将观察者(上面提到的包装类)注册给被观
察者(LifeCycleOwner)
3、setValue/postValue postValue最终也是调用setValue只不过是使用Handler切回主线程处
理
4、setValue中将mVersion(LiveData)自增1后调用dispatchingValue方法
5、dispatchingValue方法会通知所有观察者数据更新也就是调用considerNotify方法
6、considerNotify方法中先判断观察者的生命周期是否处于活跃状态 非活跃状态则return
7、接下来判断观察者的mLastVersion是否大于等于LiveData的mVersion 如果为true则不通
知 否则 将两个版本统一,然后回调LiveData注册的观察者 的onChanged方法通知数据更新

2.view的绘制原理

当一个应用启动时,会启动一个主Activity,Android系统会根据Activity的布局来对它进行绘制。绘制会从根视图ViewRootImpl的performTraversals()方法开始,从上到下遍历整个视图树,每个View控制负责绘制自己,而ViewGroup还需要负责通知自己的子View进行绘制操作。View的绘制流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,其中measure确定View的测量宽高,layout根据测量的宽高确定View在其父View中的四个顶点的位置,而draw则将View绘制到屏幕上。通过ViewGroup的递归遍历,一个View树就展现在屏幕上了。

3.事件分发机制
Activity -> PhoneWindow DecorView -> ViewGroup -> View -> 
dispatchTouchEvent(分发事件)MotionEvent ACTIONDOWN
interceptorTouchEvent(拦截事件,ViewGroup采用)return true 代表拦截事件(拦截即消
费) false(不拦截)
onTouchEvent(消费事件)return true  消费该事件 false 不消费 该事件(不消费则回调
super.onTouchEvent)
#备注:事件传递过程不是所有的View都会参与分发,通过x,y坐标(手指点击位置)判断当前控件是
否包括这个坐标,如果包含才参与事件分发流程
4.事件冲突问题
1、内部拦截法 
ListView
相对于在里面的UI控件来处理冲突问题,onDispatchTouchEvent (获取用户触摸屏幕的xy是否
在当前控件内部)调用super.requestDisallowInterceptorTouchEvent(false/true); 传入的fasle 
代表让父布局进行拦截  传入的是True代表不让父布局进行拦截事件由自己消费
2、外部拦截法
ScrollView
onInterceptrTouchEvent方法处理,(判断用户触摸的xy坐标是否在他冲突的子控件内)如果在
listview里面则 return  false 不拦截将事件交给listview消费,如果不在就进行拦截自己消费事件
 
判断方向(down事件获取xy up事件获取x1 y1 然后x与x1相减 y与y1相减 同取Math.abs绝对值判
断如果x大就是用户横着滑的 y大 就竖着滑)
5.Handler通信机制
消息机制
首先消息机制由4部分组成,Handler Message MessageQueue Looper
创建一个Message 通过Handler将这个消息发送到消息队列,Looper不断的从消息队列中提取消
息,提取到消息后进行分发,分发给Handler来处理(message callback -> handler callbck-> 
handleMessage)
创建Message 一般使用Obtain方法目的是使用对象池来进行复用对象
Looper的prepare方法 关联线程并且初始化消息队列
Looper的loop方法,死循环为什么不会卡  因为Looper.loop方法最终回调用到native jni 
(nativePollonce)其实是使用linux中的epoll机制
同步消息屏障 handler中消息类型分为同步消息 异步消息  同步消息屏障作用于同步消息,应
用场景:UI绘制 通过编舞者进行uI的协调,设置一个同步消息屏障,编舞者发送的消息是一
个异步消息从而保证UI绘制的及时性,消息发送后要移除同步消息屏障
通过handler postDelay一个消息,handler通过什么来控制这延时,其实最终会作用的
message上的when属性
Handler因为的内存泄漏问题,以postDelay为例:首先 handle在被创建时我们使用的是匿
名内部类(内部类默认会持有外部类的引用(我们所说的“外部”指的就说Activity))其次
handler与MessageQueue也存在强引用关系,有因为刚postDelay的消息在队列中,从而导
致因消息队列间接持有activity而发生的activity已经出栈但内存因强引用关系而导致的GC无
法回收出现内存泄漏问题
6.recycleview的缓存机制
 recycleView缓存的是ViewHolder
 第一级 屏幕内
 第二级屏幕外边缘
 第三级 自定义
 第四级 Pool 5个   进入第四级缓存的数据会被重置 ,如果从第四级缓存恢复的数据会重新走
onBindViewHolder方法

我爱娜娜

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值