您好,登录后才能下订单哦!
在前几年兴起了
MVVM
架构设计模式,最具有代表的框架就是
DataBinding
,虽然这种设计架构非常新颖,但是在使用中仍然还有很多痛点,所以我当时觉得短时间这个设计架构可能不会太流行。
最近接手了新项目,使用的就是
MVVM
,才发现只一两年的功夫
MVVM
的发展竟然这么快,已经是Android开发者必备的技能之一了。
DataBinding
在刚开始阶段,最令我头疼的就是数据处理的问题,往往为了显示数据,我要在
XML
中绑定
N
多个字段,如果是一个中等以上的工程,还有更蛋疼的问题,例如:
XML
可能迫切的需要
if
或者
switch
这样的判断;在2018年,
Google
推出
JetPack
库,其中的
ViewModel+LIveData
终于把
MVVM
推上了新的高度。
使用
ViewMode
l需要依赖
lifecycle
库:
implementation "android.arch.lifecycle:viewmodel:x.x.x" implementation "android.arch.lifecycle:extensions:x.x.x"
ViewModel
的创建方法主要有两种:
// 获取FragmentActivity共享的ViewModel ViewModelProviders.of(FragmentActivity).get(ViewModel::class.java) // 获取FragmentActivity共享的ViewModel ViewModelProviders.of(Fragment).get(ViewModel::class.java)
ViewModel
的共享范围主要有两种:一种是
FragmentActivity
,一种是
Fragment
,可以根据自己的需要选择共享的范围。如果你想要一个
Application
级别的
ViewModel
,目前是不支持的,你可以自定义
Application
持有一个
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> <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>
刚才我们已经讨论了
ViewModel
的用法,但是还有一个问题没有解决,那就是数据更新的问题,解决这个问题的最佳方式就是观察者模式,但是如果没有处理好观察者的注册和解绑很容易出现内存溢出。
LiveData
就可以完美的解决这个问题。
我们需要添加
LiveData
的依赖:
implementation "androidx.lifecycle:lifecycle-livedata:2.1.0"
下面是一个简单的示例:
// 名为openDrawer的Boolean类型的LiveData public 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
再次细分。
附上我的Android核心技术学习大纲,获取相关内容来我的GitHub一起玩耍:
https://github.com/Meng997998/AndroidJX
vx:xx1341452
对于进阶这条路而言,学习是会有回报的!
你把你的时间投资在学习上,就意味着你可以收获技能,更有机会增加收入。
在这里分享我的Android学习PDF大全来学习,这份Android学习PDF大全真的包含了方方面面了,内含Java基础知识点、Android基础、Android进阶延伸、算法合集等等
我的这份学习合集,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
获取方式:关注我看个人介绍,或直接 点击我免费领取
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。