加载xml标签会解析生成2份
app/intermediates/data_binding_layout_info_type_merge/out
命名规则(原命名-layout.xml)
主要通过包名位置、tag(对应第二个xml的位置)、expression(来确定绑定的位置)。及以后apt的生成。originalTag是你原来的设置的tag
app/intermediates/incremental/mergeDebugResources/stripped.dir/layout
命名规则 -原命名
会在现有的xml 自动添加tag属性,进行与上个文档的绑定。
生成的apt文件目录app/build/generated/ap_generated_sources/out(java) kotlin在此目录上级目录下,自己找。
会通过apt自动生成的BR.xx 去查找数组的位置,数组中之前已经设置监听器(weakPropertyListener->
onPropertyChanged),通过监听器调用apt生成的xxximp.javahandle去更新ui
databinding 必须是19以上包含 才能使用。默认绑定会在ViewDataBinding 上面有个static{}语句块初始化。
问题的规整
布局控件都会放到一个数组对象中,那么这个数组对象大小是不定的,如果你有多个activity就会存在多个数组对象,这是比较占用内存的。
所有的model更新都是通过handler通知view进行更新的,handler内部拥有一个Looper对象,是不断的在执行消息循环。每一个activity都会存在一个handler,这样也会导致内存的大量消耗。
针对每一个控件都添加了一个监听mboundView1androidTextAttrChanged,mboundView2androidTextAttrChanged。针对第一个监听,进入监听回调方法。针对每一个控件都会存在一个回调对象,针对多个activity,也会导致内存的大量消耗
四、总结
1、dataBinding只是一种工具,和MVVM(设计思想)是完全没有关系的,MVC、MVP同样可以使用dataBinding。
2、使用dataBinding会导致大量的内存消耗,具体在3个地方会导致该情况发生。
(1)会产生多余的数组,存放view对象
(2)存在大量handler,looper不断的循环消息
(3)针对每一个控件都会产生一个回调对象
3、dataBinding使用APT技术,编译期间生成控件与model的绑定代码。所以会产生很多类,随着布局文件的增加,编译会越来越慢。
参考地址:https://blog.csdn.net/qinbin2015/article/details/93916842
room介绍
https://blog.csdn.net/u012735483/article/details/78737622
自己感觉的
优点:可以跟JetPack全家桶一起使用,比如数据生命周期的管理
缺点:代码有些繁琐,比如新建数据库都需要去做映射entities = {Student.class}。一些单字段查询,关联查询需要重新创建实体类做相关的映射。
ViewModel 的作用
以注重生命周期的方式存储和管理界面相关的数据。ViewModel
类让数据可在发生屏幕旋转等配置更改后继续留存。在对应的作用域内,保正只生产出对应的唯一实例,保证UI组件间的通信。
Livedata的作用
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
Navigation
1、App需要有确定的起始点
2、使用一个栈来代表App的导航状态
3、向上按钮从不会退出你的App
4、在App任务中向上和返回按钮是等价的
5、深度链接到目标或导航到相同的目标应产生相同的堆栈
总体navigation的出现,就是为了尽量替换activity。减少asm的通讯,加快响应速度及跨进程通讯。参考
paging
优点:
自带分页,预加载处理
子线程diff,主线程局部刷新
可以和Room无缝结合
能设置距离最后还有多少个item时,开始加载下一页的数据
缺点:
使用复杂,有待封装