MVVP框架学习(二)---------ViewModel以及LiveData中如何使用

一.序

上篇文章说到,我们可以通过DataBinding去绑定我们的xml以及使用我们的数据源。那ViewModel和LiveData就是在JVVM中专门用来做数据源的两个组件。

二.ViewModel

ViewModel 是Android 架构组件中负责管理UI相关数据与逻辑的,可以说它就是专门做这个界面的数据存储和驱动的。个人认为,这是一个界面对应一个ViewModel.
ViewModel的优点:
解决了运行中断和界面重建时的数据保存问题 (横竖屏切换,导致Activity销毁并重新创建时,ViewMode仍然可以保留之前读取到的数据不会因为Activity的销毁而丢失,这样我们无需额外再浪费资源去再次请求数据)—>让运行速度快速的提高。
配合LiveData实时获取最新数据
实现Activity中Fragment之间的数据交互(数据共享)
数据和界面的分离,使数据驱动界面 (ViewModel类被设计为通过lifecycle感知的方式存储和管理UI相关数据)
大佬的理解
ViewModel帮我们解决了很多事情,大概概括为,解决了数据内存中的生命周期管理问题,这是因为VIewModel持有 Context 或 activity 或 view 的引用。也是因为这个特点,也解决了同一个Activity,不同的Fragment中数据共享的问题,这样就不需要多次去发起数据的请求了。
使用方法:
定义一个类,继承ViewModel

public class MyViewModel extends ViewModel {
    public int number = 0;
}

在Activity中引用,并且加上按钮去改变里面的值,


public class jvvm_ViewModel extends AppCompatActivity {
    MyViewModel myViewModel;
    Button button;
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jvvm__view_model);
        //创建ViewModel
        myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
        button = findViewById(R.id.button);
        textView = findViewById(R.id.textView);
        textView.setText(String.valueOf(myViewModel.number));
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myViewModel.number++;
                textView.setText(String.valueOf(myViewModel.number));
            }
        });

    
}

当点击按钮,数字变化后,对屏幕进行旋转,可以看到,原本的增加的数字并没有被销毁而是被保存下来了。
组件共享,可以将ViewModel做单例,然后在Fragment中传入同一个Activity即可。
具体我就只贴大佬写的了。
组件共享的话,可以在这里看大佬的

三.LiveData

Livedata 是一个数据源的包装类,他可以有效的取代请求callback接口,还可以配合Lifecycle感知程序组件生命周期。
先放上一个最简单的ViewMode+LiveData的组合先,有一个清晰的认知。

public class ViewModelWithDataBind extends ViewModel {
    private MutableLiveData<Integer> liveData;
    }

优点:
确保UI界面的数据状态
没有内存泄漏,不会因为Activity的不可见导致Crash
一个存放可被观察的数据持有类,但与一般的被观察者不同的是,它是有生命周期感知功能,解决了android开发者需要去手动处理生命周期的痛点。
上面的优点来源于它的观察时,需要放入一个LifecycleOwner对象

     viewModelWithLifeData.getLiveData().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
        
            }
        });

LiveData,一般来讲是一起配合ViewModel一起使用就可以拥有很多的优点,但是我认为liveData应该是主职数据的生命周期和进行数据的观察两者。而且在观察中,也不需要关心Activity的声明周期。而且我们也不需要去写接口回调然后去setCallBack了,方便了许多。
剩下的还有map和switchmap的功能。我也不做多介绍了。

ViewModel+LiveData一起一共解决了下面的事情:
取代请求callback接口
数据共享性
解决数据声明周期问题

当然,还可以搭配上DataBinding,各个去做自己比较有特色的事情,这样会让代码结构很清晰。
本人在做demo的时候,一直觉得很奇怪的事情是,DataBinding是可以双向绑定的,而LiveData的观察也差不多做了相同的事情。只是说,dataBinding的双向绑定没办法去做更多的事情,所以可能不太推荐。不过用来绑定数据初始化和设置Onclick倒是用起来挺舒服的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值