jetpack mvvm架构

Jetpack MVVM理解

参考文档

Jetpack模式是mvvm在安卓开发下的一个具体实现,是官方推荐的用法,通过数据驱动完成解耦,兼备控制试图的生命周期,Lifecycle能够妥善处理页面的周期,避免view的空指针问题,ViewModel是的UI重建时无需向后台请求数据,节省开销,让试图重建时更快的展现数据,下图展示了mvvm下所有模块如何交互。
jetpack mvvm架构_第1张图片
各模块对应MVVM架构

  • View层: Activity/Fragment
  • ViewModel层:Jetpack ViewModel + LiveData
  • Model层:Repository仓库,包括本地和服务器仓库
    View层包含了我们Activity/Fragment布局文件等与界面有关的东西
    ViewModel层包含了UI相关的数据,保证数据在屏幕旋转时不会丢失,并且提供接口给View层调用以及与Model层通信
    Model层主要判断数据是从本地加载还是从网络中获取,并将获取的数据返回给调用方。本地的数据源可以采用数据库,SharedPreference等持久化数据。网络数据可以通过Retrofit访问服务器提供的WebService接口来实现。
    另外,图中的绑定都是单向的,比如View层不能持有仓库层的引用,谨记每一层的组件都只能与它相邻层的组件进行交互。
    这种设计打造了一致且愉快的用户体验。无论用户上次使用应用是在几分钟前还是几天之前,现在回到应用时都会立即看到应用在本地保留的数据。如果此数据已过期,则应用的Repository将开始在后台更新数据。

LiveData

LiveData实现原理
LiveData 是一种可观察的数据存储器。应用中的其他组件可以使用此存储器监控对象的更改,而无需在它们之间创建明确且严格的依赖路径。LiveData 组件还遵循应用组件(如 Activity、Fragment 和Service)的生命周期状态,并包括清理逻辑以防止对象泄漏和过多的内存消耗。因为LiveData具有生命周期感知能力,这意味着,除非 Activity 处于活跃状态,否则它不会调用onChanged() 回调。当调用 Activity 的 onDestroy() 方法时,LiveData 还会自动移除观察者。另外,我们也没有添加任何逻辑来处理配置更改(例如,用户旋转设备的屏幕)。
ViewModel用于存放页面所需要的各种数据,不仅如此,我们还可以在其中放一些与数据相关的业务逻辑。我们可以在ViewModel中进行数据的加工、获取等操作。因此,ViewModel的数据可能会随着业务的变化而变化。

但是对于页面来说,它并不需要关心ViewModel中的业务变化,只关心数据在变化之后可以获取到通知并进行更新。LiveData就可以做到,在ViewModel中的数据发生变化时通知页面。所以,LiveData通常被放在ViewModel中用来包装那些需要被界面观察的数据。

LiveData.observeForever()与observe()的区别

LiveData还有一个名为observeForever()的方法,使用起来与observe()没有太大差别。它们的区别主要生命周期的监听。

observe
会在lifecycle大于等于Started的时候才为激活状态(可以观察到数据变化给回调),在lifecycle为Destroy的时候会自动调用removeObserver()移除观察者。可以有效的防止内存泄漏,程序异常。
observeForever
无论页面处于什么状态,observeForever()都能收到通知。因此,在用完之后,一定要记得调用removeObserver()方法来移除观察者,否则会造成了内存泄漏。

简单总结

LiveData的就是一个观察者模式,且它可以感知到页面的生命周期,只在页面存活时才会进行通知,避免了内存泄漏。当然你也可以使用observeForever()让LiveData忽略页面的生命周期,但用完后,一定要记得使用removeObserver()移除,否则会造成内存泄漏。

MVP改造MVVM

步骤如下:

  1. 去除Presener 对View、context的引用。
  2. Presener 替换成ViewModel的实现,获取的数据以 LivaData呈现。
  3. 删除定义的IView等接口,Activity/Fragment中 获取ViewModel实例,调用其方法获取数据。
  4. Activity/Fragment 观察需要的 LivaData 然后刷新UI。
    这样就已经成为了MVVM。当然也要检查下 原MVP的 Model层的实现,是否满足上面的要求。

你可能感兴趣的:(架构,android,android,jetpack)