写点什么

使用 DataBinding 还在为数据处理头疼?这篇文章帮你解决问题

用户头像
Android架构
关注
发布于: 13 小时前

使用 ViewModel 需要依赖 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,或者使用单例模式。

[](

)ViewModel 解决的问题


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


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


  • 可能无法预测 setArguments 会在 Fragment 的哪个周期完成,要进行异常判断;

  • setArguments 中的数据可能会发现改变,如果是 Activity 直接设置 Fragment 的数据,耦合性很高;

  • 数据较多时,Fragment 会有很多的变量,影响可读性和维护性。


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


  • 新加数据传递,不用修


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


改 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>

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
使用DataBinding还在为数据处理头疼?这篇文章帮你解决问题