56星座屋
当前位置: 首页 星座百科

databinding原理面试(底层原理剖析系列)

时间:2023-05-31 作者: 小编 阅读量: 4 栏目名: 星座百科

ViewModel解决的问题1、扩大数据共享的应用场景。虽然DataBinding支持三元运算符,能够满足if判断的需要,但是很显然在XML维护逻辑要比Java或者Kotlin要困难的多。所以我们非常需要把部分代码从XML分离出来,ViewModel就非常适合担任这个角色。observer:观察的值发生变化的回调函数owner直接使用Activity或者Fragment即可。总结最后我画了一张架构图,总结了一下最新的MVVM的使用架构:Activity:处理UI问题,但是应当尽量避免这样做,尽量统一使用

前言

在前几年兴起了MVVM架构设计模式,最具有代表的框架就是DataBinding,虽然这种设计架构非常新颖,但是在使用中仍然还有很多痛点,所以我当时觉得短时间这个设计架构可能不会太流行。

最近接手了新项目,使用的就是MVVM,才发现只一两年的功夫MVVM的发展竟然这么快,已经是Android开发者必备的技能之一了。

正文

DataBinding在刚开始阶段,最令我头疼的就是数据处理的问题,往往为了显示数据,我要在XML中绑定N多个字段,如果是一个中等以上的工程,还有更蛋疼的问题,例如:

  • 你的XML可能迫切的需要if或者switch这样的判断;
  • 意想不到的空指针

在2018年,Google推出JetPack库,其中的ViewModel+LIveData终于把MVVM推上了新的高度。

ViewModel

使用ViewModel需要依赖lifecycle库:

implementation "android.arch.lifecycle:viewmodel:x.x.x"implementation "android.arch.lifecycle:extensions:x.x.x"

ViewModel的创建方法主要有两种:

// 获取FragmentActivity共享的ViewModelViewModelProviders.of(FragmentActivity).get(ViewModel::class.java)// 获取FragmentActivity共享的ViewModelViewModelProviders.of(Fragment).get(ViewModel::class.java)

ViewModel的共享范围主要有两种:一种是FragmentActivity,一种是Fragment,可以根据自己的需要选择共享的范围。如果你想要一个Application级别的ViewModel,目前是不支持的,你可以自定义Application持有一个ViewModel,或者使用单例模式。

ViewModel解决的问题

1、扩大数据共享的应用场景。

一般的数据共享是Activity与Fragment的数据传递,传统做法是使用setArguments(Bundle),这种方法有以下弊端:

  • 可能无法预测setArguments会在Fragment的哪个周期完成,要进行异常判断;
  • setArguments中的数据可能会发现改变,如果是Activity直接设置Fragment的数据,耦合性很高;
  • 数据较多时,Fragment会有很多的变量,影响可读性和维护性。

使用ViewModel,可以避免以上的尴尬情况,需要什么数据就从ViewModel中取:

  • 新加数据传递,不用修改Activity的setArguments代码,Fragment也不用编写数据接收的方法;
  • 减少数据传递,不必考虑是否要删除暂时无用的代码;
  • 取数据时,请注意数据的有效性,做好判断即可;

除此之外,自定义View也可以得到ViewModel,这样某些功能耦合性非常强的自定义View开发更加便捷。不过需要注意的是View的context的上下文是Activity类型(不会是Fragment)的,所以只能使用Activity级别的数据共享。

2、解决DataBinding的视图显示问题。

如果视图的显示需要很多的数据,那么XML就会变得越来越臃肿,并且迫切需要添加一些简单的判断,例如:

如果A为空就显示B,如果B为空就先是C,如果是C为空…

虽然DataBinding支持三元运算符,能够满足if判断的需要,但是很显然在XML维护逻辑要比Java或者Kotlin要困难的多(无拼写错误提示等)。所以我们非常需要把部分代码从XML分离出来,ViewModel就非常适合担任这个角色。

修改前:

<?xml version="1.0" encoding="utf-8"?><layout><data><variablename="A"type="String" /><variablename="B"type="String" /><variablename="C"type="String" /></data><TextViewandroid:layout_android:layout_android:maxLines="4"android:ellipandroid:text="A != null ? A : B != null ? B : C" />...</layout>

修改后:

<?xml version="1.0" encoding="utf-8"?><layout><data><variablename="viewModel"type="ViewModel" /></data><TextViewandroid:layout_android:layout_android:maxLines="4"android:ellipandroid:text="@{viewModel.getShowContent()}" />...</layout>

LiveData

刚才我们已经讨论了ViewModel的用法,但是还有一个问题没有解决,那就是数据更新的问题,解决这个问题的最佳方式就是观察者模式,但是如果没有处理好观察者的注册和解绑很容易出现内存溢出。LiveData就可以完美的解决这个问题。

我们需要添加LiveData的依赖:

implementation "androidx.lifecycle:lifecycle-livedata:2.1.0"

下面是一个简单的示例:

// 名为openDrawer的Boolean类型的LiveDatapublic final MutableLiveData<Boolean> openDrawer = new MutableLiveData<>();// 更新openDrawer openDrawer.setValue(true)// 观察openDrawer 的值的变化openDrawer.observe(this, aBoolean -> {Toast.makeText(this, "${aBoolean}", Toast.LENGTH_SHORT).show();});

LiveData的子类是MutableLiveData,内部有value属性保存最新的值,订阅LiveData的变化,直接调用LiveData.observe():

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)owner:注册的周期,会在owner销毁的时候,解绑观察者。observer:观察的值发生变化的回调函数

owner直接使用Activity或者Fragment即可。如果你还不了解Lifecycle的使用,可以查看一下相关的资料。

总结

最后我画了一张架构图,总结了一下最新的MVVM的使用架构:

Activity:处理UI问题,但是应当尽量避免这样做,尽量统一使用DataBinding。ViewModel:保存页面需要的数据,功能复杂的话可以拆分成多个。DataBinding:处理UI视图,持有ViewModel做数据展示。如果页面功能比较复杂,可以对ViewModel和DataBinding再次细分。

如果大家对MVVM有更棒的理解,欢迎留言共同学习。

    推荐阅读
  • 红菜苔与什么相克(红菜苔禁忌与搭配)

    红菜苔是生活中一种比较常见的蔬菜,其中所含的成分大部分的食材都不存在配伍禁忌,一起食用也不会产生毒性物质,所以一般情况下是不存在特殊相克食物的。

  • 酒是谁发明的(酒是谁发明的解析)

    酒是谁发明的相传,酒是杜康发明制造的。大体上,古酒约分两种:一为果实谷类酿成之色酒,二为蒸馏酒。有色酒起源于古代,据《神农本草》所载,酒起源于远古与神农时代。《世本八种》(增订本)陈其荣谓:“仪狄始作,酒醪,变五味,少康作秣酒。”余以为此种酒,恐是果实花木为之,非谷类之酒。谷类之酒应起于农业兴盛之后。樵子入山,得其巢穴者,其酒多至数石,饮之香美异常,名猿酒。

  • 节食减肥会反弹吗(减肥节食会不会反弹)

    节食减肥是会出现反弹情况的,这是因为节食期间基础代谢率会缓慢下降,直到和摄入量维持平衡,此时体重就不再下降。相对的,恢复正常饮食,基础代谢率也会缓慢上升,但是恢复正常饮食初期摄入的能量会大于代谢的能量,直至代谢率和摄入量维持平衡,体重不再增加。所以一般不推荐节食减肥的方法。目的是让良好的运动和饮食,成为自觉的生活习惯。

  • 5万以内的国产纯电动汽车(5款5万元内纯电动汽车推荐)

    另外,奇瑞QQ冰淇淋还标配了上坡辅助功能,来防止坡起时溜车。目前,朋克多多在售的只有炫多多和酷多多两款车型,前者NEDC续航128公里,后者NEDC续航178公里。动力部分,该车搭载最大功率29千瓦的永磁同步电机。据悉,朋克多多将新增一款续航里程为175公里的酷多多pro车型,该车型将增加皮质座椅、铝合金轮圈及右侧盲区摄像头等配置,预计在今年4月正式上市。上下细长的进气格栅,个性并有着一定层次感。

  • 中铁的平凡生活(工程人的中铁岁月)

    行李的旅程SG站下了火车,需换乘公交车到达工程局机关办公处。第一天是开班仪式,公司的经理、中层领导干部对新生力量表示热烈欢迎。首先是两市之间一无高铁或动车,二无直达列车。其次,当天因暴雨,株洲至NG的火车晚点延误2小时,眼看到NG或许又将是夜色降临。与贺总一同起居压力很大。

  • 天天象棋第122关那句残局怎么破?(天天象棋第121关残局怎么破?)

    只有兵进行突围了,兵三进一,被象吃,没有作用。

  • 踧踖的读音和意思(踧踖的解释)

    踧踖是一个汉语词汇,拼音:cùjí,释义:恭敬不安,意谓恭敬而不自然的样子形容坐立不安或徘徊不进貌偏正式;作谓语、定语;含贬义,今天小编就来聊一聊关于踧踖的读音和意思?接下来我们就一起去研究一下吧!踧踖的读音和意思踧踖是一个汉语词汇,拼音:cùjí,释义:恭敬不安,意谓恭敬而不自然的样子。

  • 文案高级简短(高级简短文案有哪些)

    以下内容大家不妨参考一二希望能帮到您!文案高级简短风很清澈,从头到脚都快乐。远赴人间惊鸿宴,一睹人间盛世颜。最暗的夜,才会看见最美的星光。零星的变得优秀,也能拼凑出星河。人喝了酒眼睛亮闪闪的讲浪漫和爱。各有各的思想,我的不值一提。过路人,不用假装,不用善良。枯坐到清晨,阳光替房间开了灯。做一个温柔的人,永远不卑不亢、清澈善良。再多努力一下,从天而降的星星就是你。

  • 芋头痒手最快祛痒方法(关于芋头痒手最快祛痒方法)

    芋头痒手最快祛痒方法在给芋头去皮的时候,戴上一次性的手套或者可以套上朔料袋。这样就可以避免了。当双手因刮芋头而发痒时,若将双手放在炉火上方略烤一下,即可止痒。但使用此法时,须注意别灼伤手皮。当双手因刮芋头而发痒时,用脸盆盛些清水,加入少许食醋,搅拌均匀后用来洗手,也可止痒。因刮芋头皮而双手感到奇痒难耐时,可先用清水冲洗,然后抹干水渍,搽上一点风油精并加以轻轻擦拭,痒感即除。

  • 刮痧板的使用方法和注意事项(刮痧板的使用方法和注意事项视频)

    可以加强刮痧的作用。对于保健刮痧无严格的时间限制,以自我感觉满意、舒服为原则。注意事项1、刮痧治疗时应注意室内保暖,尤其是在冬季应避寒冷与风口。夏季刮痧时,应回避风扇直接吹刮试部位。再次刮痧时间需间隔3-6天,以皮肤上痧退为标准。建议经常化妆的女性一个星期做一次刮痧美容,其它女性可半月或每月一次。