Android MVVM-编程思想1(入门介绍MVVM,DataBinding,ViewModel,LiveData)

前言

通过一个小案例,帮助大家了解MVVM。最终实现一个MVVM通用框架。代码:github。(如有错误之处,请在评论区指出,谢谢。如果感觉写的不错,请点赞,关注,谢谢。)

上一个小节,只是理论介绍了MVVM,DataBinding,ViewModel,LiveData,这一小节,讲解一下他们的使用方式。如果已经对这些基础知识很了解,可以直接看下一节。

目录:

Android MVVM-编程思想1(入门介绍MVVM,DataBinding,ViewModel,LiveData)
Android MVVM-编程思想2(入门实战MVVM,DataBinding,ViewModel,LiveData)
Android MVVM-编程思想3(封装基类BaseMvvmActivity,BaseMvvmFragment)

什么是MVVM?

盗的一张图
Android MVVM-编程思想1(入门介绍MVVM,DataBinding,ViewModel,LiveData)_第1张图片
View:对应于Activity/Fragment/自定义View,主要负责UI渲染。
Model:实体模型
ViewModel: 负责业务逻辑处理,负责View和Model的交互。和View层双向绑定。

Android MVVM-编程思想1(入门介绍MVVM,DataBinding,ViewModel,LiveData)_第2张图片

Mvvm模式是通过将View层和ViewModel层进行双向绑定, View层的变化会自动通知给ViewModel层,而ViewModel层的数据变化也会通知给View层进行相应的UI的更新。这样,Model层只负责暴露获取数据的方法,View层只负责监听数据的变化更新,而ViewModel负责接收View层的事件指令以及获取并处理数据。从而实现业务逻辑和Ui的隔离。

对比MVP

了解MVP编程思想的同学都知道MVP一个最大的缺点就是需要写大量接口。没接触过MVP的童鞋可以看一下我之前写的 Android-MVP编程思想系列。

MVP是对MVC的C的演化,MVVM是对MVP的P的演化。MVVM的出现是MVP的进化版本,弥补了MVP需要大量接口的缺点。如何弥补的?使用了双向绑定这个思想。原来MVP,M和V直接的通信通过P层和接口来实现。现在使用双向绑定,VM,所以就不需要接口了。MVVM是一种思想,采用双向绑定将Model和View绑定起来, View的变动自动反映在View Model,反之亦然。这样开发者就不用处理接收事件和View更新的工作,框架已经帮你做好了,双向绑定的机制使得M和V之间的通信工作不需要再使用接口了。

涉及的库

(1) DataBinding

Data Binding顾名思义,数据绑定,是Google对MVVM在Android上的一种实现,可以直接绑定数据到xml中,并实现自动刷新。现在最新的版本还支持双向绑定。
作用:数据与view自动映射,所以不需要写findViewByid, onClickListernr.(这一点类似使用的ButterKnife)
不需要setText()手动设置数据。比手动性能更高。

(1) ViewModel

MVVM中的VM,非常重要,负责加载数据,逻辑编写。
Android 官方提供了ViewModel基类是以可感知生命周期的方式存储和管理 UI 相关数据。我只想说,太他踏马好用了。。。。
优势(1)举个栗子:在屏幕旋转的时候会经历 Activity 的销毁与重新创建,这里就涉及到数据保存的问题,显然重新请求或加载数据是不友好的。在 ViewModel 出现之前我们可以用 Activity 的 onSaveInstanceState() 机制保存和恢复数据,但缺点很明显,onSaveInstanceState只适合保存少量的可以被序列化、反序列化的数据,这种机制明显不合适。所以上ViewModel…屌炸天,有没有,让开发者只专注业务逻辑。
优势(2)Fragments 间共享数据,看代码(来自andorid官网)

 public class SharedViewModel extends ViewModel {
        private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

        public void select(Item item) {
            selected.setValue(item);
        }

        public LiveData<Item> getSelected() {
            return selected;
        }
    }

    public class MasterFragment extends Fragment {
        private SharedViewModel model;
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
            itemSelector.setOnClickListener(item -> {
                model.select(item);
            });
        }
    }

    public class DetailFragment extends Fragment {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
            model.getSelected().observe(this, { item ->
               // Update the UI.
            });
        }
    }
    
LiveData

是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
解释一下:这是因为LiveData能够感知到组件的生命周期,当组件处于DESTROYED状态时,观察者对象会被清除掉。当Activity停止时不会引起崩溃,这是因为组件处于非激活状态时,不会收到,不需要额外的手动处理来响应生命周期的变化。屌炸天的东西,用起来。。。。

总结一句:mvvm对mvp的横向演进,用双向绑定机制解放了我们拿到数据关注某个具体控件,并隐式的绑定了View层的生命周期,在内存泄漏上有一定优势。

这一小节简单介绍了MVVM模式,以及Android中支持MVVM的官方库。下一节开始使用这些库来封装好用的MVVM架构。

参考:
https://blog.csdn.net/user11223344abc/article/details/82661128
https://blog.csdn.net/yyz_1987/article/details/81380664

你可能感兴趣的:(architectural,thinking)