Mvvm开发模式解读

作者: 奔跑吧李博 | 来源:发表于2020-08-03 14:51 被阅读0次
    Mvvm模式架构图
    MVVM 模式与Mvp:

    Mvvm将Mvp的Presenter 改名为 ViewModel,基本上与 MVP 模式一致。但是它省去了MVP模式中编写大量接口的麻烦。它采用双向绑定(data-binding),View的变动,自动反映在 ViewModel,Viewmodel改变,也自动在view中刷新,降低了和View的耦合度。

    View层(Activity/Fragment)

    显而易见,Activity/Fragment 便是MVVM中的View,当收到ViewModel传递来的数据时,Activity/Fragment负责将数据以你喜欢的方式显示出来。

    ViewModel层

    • 解耦性强
      Viewmodel其实就是activity中一个普通的实体。Activity持有viewmodel的引用,业务逻辑在viewmodel进行,关于界面和ui的操作在activity中进行,而添加和释放资源和viewmodel有关的那么就在viewmodel中设置函数,然后在activity中调用。ViewModel作为Activity/Fragment与其他组件的连接器,负责转换和聚合Model中返回的数据,使这些数据易于显示,并把这些数据改变及时的通知给Activity/Fragment。

    • 多个组件共享viewmodel
      ViewModel可以很方便的在同一个Activity中多个Fragment中共享,只需要在ViewModelProviders.of(activity)时传入Fragment所在的Activity实例即可。

    • 保存数据功能更强大
      相比于 onSaveInstanceState 、序列化等保存UI状态的方法,ViewModel更加轻量级,也能高性能的存储复杂类型的数据。

    Model

    Repository及其下方就是Model了。Repository负责提取和处理数据。数据可以来自本地数据库(Room),也可以来自网络,这些数据统一有Repository处理,对应隐藏数据来源及获取方式。

    View与ViewModel如何实现自动刷新数据?

    View层与ViewModel层的通信是通过LiveData这个架构组件实现的,不同于MVP架构中通过接口来通信。
    Android中的数据绑定技术由 DataBinding和LiveData共同实现。当Activity/Fragment接收到来自ViewModel中的新数据时,由LiveData自动通知数据的改变,将这些数据通过DataBinding绑定到ViewDataBinding中,UI将会自动刷新,而不用书写类似setText的方法。随即DataBinding和LiveData闪亮登场。

    DataBinding

    Databing是Google发布的一个用来支持MVVM模式的框架,它的主要作用是用来降低布局和逻辑的耦合度。省去了各个findViewById,当viewmodel层数据更新,UI也会随即更新。
    DataBinding可以做数据绑定,事件绑定,相应类的import,可以引入Java类或自定义类。

    LiveData与MutableLiveData

    LiveData是具有生命周期意识的一个可观察的的数据持有者,ViewModel中的数据由LiveData持有,并且只有当Activity/Fragment处于活动时才会通知UI数据的改变,避免无用的刷新UI;
    它提供一个泛型来包装数据,它允许应用中的组建来观察LiveData中对象的变化。更进一步来讲,LiveData将数据的生产者与数据的消费者进行了分离。

    LiveData特点:

    1.首先LiveData其实与数据实体类是一样的东西,它负责暂存数据.
    2.其次LiveData其实也是一个观察者模式的数据实体类,它可以跟它注册的观察者回调数据是否已经更新.
    3.LiveData还能知晓它绑定的Activity或者Fragment的生命周期,它只会给前台活动的activity回调,避免组件销毁后发生意想不到的崩溃情况。

    举例LiveData的一个用法,你可以封装一个自己的BaseLivedata类,用于统一通知网络请求的成功、失败、数据为空等状态的回调。

    LiveData与MutableLiveData区别

    1.MutableLiveData的父类是LiveData。

    2.LiveData在实体类里可以通知指定某个字段的数据更新。MutableLiveData则是完全是整个实体类或者数据类型变化后才通知,不会细节到某个字段。

    简单例子实现livedata的局部更新通知:

    public class UserBean extends LiveData<UserBean> {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
            postValue(this);
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
            postValue(this);
        }
    }
    
            viewModel.getUserBean().setName("你的名字");
    
            viewModel.getUserBean().observe(this, new Observer<UserBean>() {
                @Override
                public void onChanged(UserBean userBean) {
                    Log.i("TAG", "数据有更新");
                }
            });
    
    MutableLiveData类的方法:

    setValue() :必须从主线程调用此方法,设置值给它的观察者
    postValue():此方法可以在其他线程中调用
    removeObserver(): 移除指定观察者
    removeObservers():移除所有观察者
    observeForever():设置永久观察者

    Lifecycle

    Lifecycle是Google官方提供的方便管理生命周期事件的方式,可以更方便的监听生命周期变化事件,它以注解的方式作用在方法上,当生命周期方法调用时,它也会被跟随调用。

    Lifecycle详情见这里

    相关文章

      网友评论

        本文标题:Mvvm开发模式解读

        本文链接:https://www.haomeiwen.com/subject/jtwqvctx.html