1.LifeCycle 听课总结
1.lifyCycle 的使用
一:当项目升级到Androidx 之后 appCompatActivity 继承的 CompotentActivity 会实现 LifecycleOwner 接口 getLifecycle 返回的就是Lifecycle 在activity中 直接 getLifecycle.addObserver( LifecycleObserver observer)
二:继承 LifecycleObserver 方法要使用注解
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public fun disConnectOnDestroy() { }
三:继承 defaultLifecycleObserver 不需要使用注解
2.lifecycle 关键的类
Event 事件
ON_CREATE
ON_START
ON_RESUME
ON_PAUSE
ON_STOP
ON_DESTORY
ON_ANY
State 状态
INITIALIZED
DESTORY --> ON_DESTORY
CREATE --> ON_CREATE ON_STOP
ONSART --> ON_START ON_PAUSE
ONRESUME --> ON_RESUME
3.lifecycle 源码
事件--》状态--》事件
总体的操作 是通过反射实现
addObserver 方法就是 将观察者 放到一个mCallbackmap里面
lifeCycle 能实现监听的原理:其实是在actiivty(CompotentActivity) 中放入个没有没有界面reportFreagment 通过这个这个freagment里面的声明周期进行监听 调用 dispatch方法
dispatch方法里面对是那个生命周期做判断 枚举比较大小 做向前向后操作 获取状态 由状态推理事件 知道事件之后在进行反射处理
问题: addObserver 将观察者存到 mObserverMap中 怎么和ComponentActivity 中进行 reportfreament 中diapath方法中获取状态 状态获取事件 获取事件 在反射 进行关联
在由状态获取事件 判断是向前还是向后的时候用到了 ObserverMap
LiveData
liveData个人理解 :(和EventBus功能类似)使用观察者设计模式 ,即是观察者 也是被观察者 调用observe 设置监听 子线程中 postvalue(postvalue 后面也是调用value) 主线程 value 设置值 从而回调到observe onChange方法中
liveData 粘性数据 (数据倒灌):产生的原因 先setvalue值 mVersion++ 在observer 的时候 有个判断 if (mLastVsersion>=mversion)判断 mLastVersion为-1 mVersion因为做了 ++操作所以 mversion为0 不符合前面的判断 直接走下面的代码 调用onchange方法进行数据分发操作
粘性数据解决方法 : 使用hook 反射 获取到mVersion 将值赋值给mlastVersion 使得两个参数对其(也就是相等)
LiveData 怎么感知生命周期感知?需要取消注册吗?
1.通过Lefecycle感知生命周期 Observe 第一个参数就是LifecycleOwer 第二个是observer (只有onChange 一个回调) 调用两个参数 封装成一个 lifeCycleBoundObserve 最后将lifeCycleBoundObservezuowei 参数放到owner.getLifeCycle.setObserve("参数中")
不需要手动取消注册 因为liveData 有感知生命周期功能 当是DESTORY状态时 会调用removeObserve
setValue 和 postValue 有什么区别
setvalue 只能在主线程 postValue 在子线程 (其实可以在任何线程)
设置相同的值,订阅的观察者们会收到同样的值吗
会受到同样的值的 ,liveData多个订阅 如果收不到同一个值 那这个控件就不能用的了
粘性事件原理,怎么防止数据倒灌
解释看上面 liveData 粘性数据分析
observeForever怎么用
和observe 一样的使用 不传lifeCycleOwner 所以没有感知生命周期能力 ,并且Destory 状态 需要手动释放监听
ViewBanding
直接能获取view 不用findviewbyId 和kotlin-android-extensions 插件效果一样 区别点是 使用插件在当前的activity中 不光能获取到自己的布局控件 也能获取到其他的activity的布局控件 如果使用viewbing的话只能获取到自己布局的控件
DataBinding
原理:DataBinding 会将layout 布局中 data部分和控件布局部分分为两个 布局文件 布局控件都会设置tag 两个控件通过tag关联
例如是 test.xml 文件 会生成 一个test-layout.xml (data相关操作) text.xml (布局相关操作)
耗内存地方: 1.会将布局所有的控件 放到一个Object[ ]数组中
2.view ->moule module->view 本质上面都是 使用的监听器 布局越多监听器越多,还有一点就是 只要布局或是moule一变化就要做相应的处理 这样也消耗性能(这个也是优点)
开发设置模式:
mvc
mvp
mvvm
赋值 @{user.name} 单向 mode-->view
@={user.name} 双向 view-->mode mode-view
ViewModule
1.保持数据的稳定性 横竖屏切换数据不会丢失, CompontActivity中 有个 onRet方法 是监听横竖屏切换的 这里面做了判断的 竖屏切换到横屏 会把mviewmodulestore(包含了viewmodule数据)所以数据稳定
2.横竖屏也经历 ondestory 事件了 怎么没有被清除掉
viewmodule 生命周期很长 依靠的是lifecycle avtivty 经历了ondestory 状态 才会被销毁 (这里面有个条件的 ischangingconfigurations 为false的才会回收 )当横竖屏切换的时候 ischangingconfiguretion为true 所以不会被回收