ViewModel源码分析

本文主要介绍了Android JetPack中的ViewModel组件,包括其在MVVM架构中的作用、使用方法和特点。ViewModel的设计使得数据在Activity销毁重建后仍可保留,通过ViewModelProviders获取并结合LiveData进行数据交互。接着,深入源码分析了ViewModelProviders、ViewModelStore和Factory等关键类的实现,揭示了ViewModel如何保持数据持久性和Activity生命周期无关性。最后提到了Factory的两种实现:NewInstanceFactory和AndroidViewModelFactory。
摘要由CSDN通过智能技术生成

一、ViewModel的简介
   
   2018年谷歌IO大会上正式发布了JetPack组件,其中包括Databing、Lifecycles、LiveData、Navigation、Paging、Room、ViewModel、WorkManager等一系列框架。并且发布androidx包,这些框架的最新版本组件将引入到androidx包下。
    JetPack架构组件的发布,意味着google终于拿出了官方推荐的Android开发架构,一直以来在Android开发上老生常谈三种开发模式,MVC、MVP、MVVM。整体的思想就是做一些代码封装和操作上的分离,具体三种架构的区别不在这详细描述。说一点儿个人对这三中开发模式的理解。
        MVC:Activity承担C的任务,强行carry大量业务和数据代码。
        MVP:Presenter承担主要代码任务,连接数据层和视图层的交互。
        MVVM:Model负责数据、View负责展示、ViewModel负责Model和View的交互,同时,最好的一点是View层自动监听ViewModel的数据变化。
    在JetPack组件出现之前,一直以来构建MVVM架构的方式都是代用Databing来充当ViewModel,而Databing是采用标签方式写入布局文件中的,这样一来当出现问题的时候不是太好进行调试。所以ViewMode的出现对于MVVM模式开发具有重大的意义。
    
二、ViewModel的用法和特点
    ViewModel的使用是要结合LiveData框架进行的,LiveData框架也是JetPack组件的一部分,这里先不详细进行介绍。ViewModel有两个特点,一是更加方便的保存数据,第二个特点,也是最重要的特点,就是保证数据不受Activity的销毁重建所影响,当Activity销毁重建后仍然能收到之前的数据。

1)继承ViewModel
    
    class MainViewModel : ViewModel() {
    private val repertory: MainRepository by lazy { MainRepository() }
    var data: MutableLiveData<JsonBean> = MutableLiveData()
    fun getDataFromServer(){
    repertory.getDataFromServer(data)
     }
    }
  ViewModel中持有LiveData,LiveData是ViewModel持有数据的载体。
  
  2)Activity通过ViewModelProviders获取ViewModel
   
    class MainActivity : AppCompatActivity() {
    private lateinit var mModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initData()
    }

    private fun initData() {
        mModel = ViewModelProviders.of(this)[MainViewModel::class.java]
        mModel.data?.observe(this, Observer {
            val mainAdapter = MainAdapter(this, it)
            val linearLayoutManager = LinearLayoutManager(this)
            rv.layoutManager = linearLayoutManager
            rv.adapter = mainAdapter
        })
        mModel.getDataFromServer()
     }  
    }
  
   3)通过ViewModel中的方法获取数据然后改变LiveData状态,通过响应式的方式通知到Activity进行视图更新。用法上比较简单。
   
  三、源码分析
  
 个人认为对于一个框架的学习仅仅掌握框架的用法是不够的,因为这太简单了,曾经看到过一篇博客,里面有一句话说的很好,”如果你只会用这个框架,而不清楚其中的原理和设计,那么即便这个框架性能再好,再牛逼,那也是写框架的那个人牛逼,而不是你牛逼“。我认为这句话说的很好,所以当我们学习一中新框架的时候,不能单单只会用,一定要清楚其中的原理,尽量去理解作者的设计思想,就像品茶一样,这样才能品出里面的滋味。不扯闲篇了,由于作者能力也有限,所以以上和以下分析,如有不同观点或作者描述有误请给予批评指正,欢迎来喷。
    
1)先从获取ViewModel的类入手,”ViewModelProviders“从类名中也能分析出这个类是用于提供ViewModel的。源码如下:

    
    public class ViewModelProviders {
    public ViewModelProviders() {
    }

    private static Application checkApplication(Activity activity) {
        Application application = activity.getApplication();
        if (application == null) {
            throw new IllegalStateException("Your activity/fragment is not yet attached to "
                    + "Application. You can't request ViewModel before onCreate call.");
       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值