Android Jetpack系列01——Viewmodel

1、Viewmodel是干嘛用的?

答:Viewmodel是用来保存数据的,并且可以将其与某个控件(Fragment或者Activity)的生   命周期进行绑定。

2、使用Viewmodel有什么好处?

答:1、譬如Activity因为屏幕旋转,我们需要保存一些数据的话,都会在   
onSavedInstance()中去保存数据,然后再onRestoreInstance()中去恢复,这样做的话有2个弊端:a.都需要编写额外的代码,重复劳动;b.只能保存一些实现了parceable接口的数据,  
基本上是一些基础数据,功能有限。当使用Viewmodel的时候呢,即使Activity重建了,Viewmodel中的数据不会丢失。2、因为ViewModel是跟某个组件相关的,那么针对同一  
个组件只要它绑定了Viewmodel,那么在任何其他地方只要能获取到该组件,也就能获取到Viewmodel.这样的话,就有如下应用场景。如果在一个Activity中有多个Fragment,这些  
Fragment之间的通信方式,一般是通过接口,或者通过Activity获取另外的fragment,然后调  
用其实例方法来达到目的。有了Viewmodel之后呢,每个Fragment中都可以获取到属于他们  
共同Activity的Viewmodel,那么只要一个Fragment改变了Viewmodel中的数据,其他  
fragment拿到的Viewmodel中的数据也是最新的。这样就为解决一个Activity多个Fragment之  
间的通信问题提供了另一种解决方案。

3、怎么使用ViewModel?

答:首先新建一个类继承Viewmodel:
    class BlankViewModel : ViewModel() {
    var number: Int = 1
    }
    然后将这个viewmodel与某个实现了Lifecycle的组件进行关联(默认FragmentActivity是实现  
    了Lifecycle接口的)
    class MainActivity : AppCompatActivity() {

    private lateinit var blankViewModel:BlankViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        blankViewModel = ViewModelProviders.of(this).get(BlankViewModel::class.java)
        Log.d(MainActivity::class.simpleName,blankViewModel.number.toString())
    }
}

上面有说到2点:
1、屏幕旋转,activity重建时,viewmodel中的值可持续存在,不需要做额外的操
作;
2、viewmodel替代接口用于Fragment之间的通信。
下面就来看一个例子。我们在BlankFragment01和BlankFragment02之间使用了
一个viewmodel来演示这2个特点:
在BlankFragment01中的设置一个按钮,当点击按钮时,viewmodel中的number
值就自增1.
Fragment共享activity的viewmodel的写法如下:

class BlankFragment01 : Fragment() {
 private lateinit var viewModel: BlankViewModel

    override fun onAttach(context: Context?) {
        super.onAttach(context)
        viewModel = ViewModelProviders.of(activity as FragmentActivity).get(BlankViewModel::class.java)

    }
    }

在这里插入图片描述
Gif中的页面结构如下:
在这里插入图片描述
fragment01和fragment02使用同一个viewmodel,当我点击viewmodel中按钮
时,viewmodel中的值自增1,可以看到fragment01和Fragment02中的显示数字
都变化了,这样viewmodel就可以作为fragment间的另一种通信方式;
gif中还显示,当屏幕旋转时,两个fragment中的值仍然是旋转前的值,这也说明
Activity重建时,viewmodel中的值是自动存储的。
项目代码地址:https://github.com/dongzhixuanyuan/JetPackDemo
模块:ViewModelDemo

猜你喜欢

转载自blog.csdn.net/HelloMagina/article/details/84878829