温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android开发者必备的技能你会吗?MVVM 最新学习心得!

发布时间:2020-08-18 23:50:43 来源:ITPUB博客 阅读:117 作者:yilian 栏目:移动开发

前言

在前几年兴起了 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共享的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、扩大数据共享的应用场景。

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

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

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

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

除此之外,自定义 View也可以得到 ViewModel,这样某些功能耦合性非常强的自定义 View开发更加便捷。不过需要注意的是 Viewcontext的上下文是 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类型的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的使用架构:

Android开发者必备的技能你会吗?MVVM 最新学习心得!

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

最后有话说

附上我的Android核心技术学习大纲,获取相关内容来我的GitHub一起玩耍: https://github.com/Meng997998/AndroidJX
vx:xx1341452

对于进阶这条路而言,学习是会有回报的!

你把你的时间投资在学习上,就意味着你可以收获技能,更有机会增加收入。

在这里分享我的Android学习PDF大全来学习,这份Android学习PDF大全真的包含了方方面面了,内含Java基础知识点、Android基础、Android进阶延伸、算法合集等等

Android开发者必备的技能你会吗?MVVM 最新学习心得!

我的这份学习合集,可以有效的帮助大家掌握知识点。

总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

获取方式:关注我看个人介绍,或直接  点击我免费领取

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI