首页 > 作文

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

更新时间:2023-04-05 05:43:57 阅读: 评论:0

前言

在前几年兴起了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,一种是frag周围环境ment,可以根据自己的需要选择共享的范围。如果你想要一个application级别的viewmodel,目前是不支持的,你可以自定义application持有一个viewmodel,或者使用单例模式。

viewmodel解决的问题

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

一般的数据共享是activity与fragment的数据传递,传统做法是使用targuments(bundle),这种方法有以下弊端:

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

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

新加数据传递,不用修改activity的targuments代码,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>        <variable                name="a"                type="string" />        <variable                name="b"                type="string" />        <variable                name="c"                type="string" />    </data>     <textview                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:maxlines="4"                android:ellipsize="middle"                android:text="a != null ? a : b != null ? b : c" />    ...</layout>

修改后:

<?xml version="1.0" encoding=阳光中的裸女"utf-8"?><layout>    <data>        <variable                name="viewmodel"                type="viewmodel" />    </data>    <textview                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:maxlines="4"                android:ellipsize="middle"                android: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.tvalue(true)// 观察opendrawer 的值的变化opendrawer.obrve(this, aboolean -> {             toast.maketext(this, "${aboolean}", toast.length_short)杨度简介.show();        });

livedata的子类是mutablel会计实习总结ivedata,内部有value属性保存最新的值,订阅livedata的变化,直接调用livedata.obrve():

public void obrve(@nonnull lifecycleowner owner, @nonnull obrver<? super t> obrver)owner:注册的周期,会在owner销毁的时候,解绑观察者。obrver:观察的值发生变化的回调函数

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

总结

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

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

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

本文发布于:2023-04-05 05:43:55,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/a22392c1cfbf5ebcca8136972f7c88ea.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:databinding原理面试(底层原理剖析系列).doc

本文 PDF 下载地址:databinding原理面试(底层原理剖析系列).pdf

标签:数据   观察者   架构   自定义
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图