美文网首页
Jetpack-ViewModel

Jetpack-ViewModel

作者: 有腹肌的豌豆Z | 来源:发表于2021-01-05 15:43 被阅读0次

作用:

数据容器

特点:

1.单一职责,将数据从业务中抽离出来。
2.生命周期长,存在于所属对象(Activity,Fragment)的全部生命周期
3.扩展性好,方便与其他功能组合,例如livedata,room

使用场景:

1.横竖屏切换,Activity重建,数据可依然保存
2.同一个Activity下,Fragment之间的数据共享。

原理:

使用者通过工具类(ViewModelProvider)在拥有者(ViewModelStoreOwner,例如:Fragment,FragmentActivity)中获取数据中心(ViewModelStore,简单说就是一个Map)中的某个数据(ViewModel)。如果数据中心没有,会通过工厂(Factory)创建,最常用的工厂是AndroidViewModelFactory,它创建的数据包含Application。

注意:

1.不要把context传入Viewmodel,容易造成内存泄漏
2.同一个Activity下的fragment通过ViewModel进行数据共享时,ViewModel的拥有者是Activity,传参要注意。

注意ViewModel 绝不能引用视图、Lifecycle 或可能存储对 Activity 上下文的引用的任何类。

ViewModel对象存在的时间范围是获取 ViewModel时传递给 ViewModelProviderLifecycleViewModel 将一直留在内存中,直到限定其存在时间范围的 Lifecycle永久消失:对于 Activity,是在 Activity 完成时;而对于 Fragment,是在 Fragment 分离时。

您通常在系统首次调用 Activity 对象的 onCreate() 方法时请求 ViewModel。系统可能会在 Activity 的整个生命周期内多次调用 onCreate(),如在旋转设备屏幕时。ViewModel存在的时间范围是从您首次请求 ViewModel直到 Activity 完成并销毁。

在 Fragment 之间共享数据

Activity 中的两个或更多 Fragment 需要相互通信是一种很常见的现象。想象一下拆分视图 (master-detail) Fragment 的常见情况,假设您有一个 Fragment,在该 Fragment 中,用户从列表中选择一项,还有另一个 Fragment,用于显示选定项的内容。这种情况不太容易处理,因为这两个 Fragment 都需要定义某种接口描述,并且所有者 Activity 必须将两者绑定在一起。此外,这两个 Fragment 都必须处理另一个 Fragment 尚未创建或不可见的情况。

可以使用 ViewModel对象解决这一常见的难点。这两个 Fragment 可以使用其 Activity 范围共享 ViewModel来处理此类通信,如以下示例代码所示:

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}

class DetailFragment : Fragment() {

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
            // Update the UI
        })
    }
}

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}

class DetailFragment : Fragment() {

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
            // Update the UI
        })
    }
}

请注意,这两个 Fragment 都会检索包含它们的 Activity。这样,当这两个 Fragment 各自获取 ViewModelProvider 时,它们会收到相同的 SharedViewModel 实例(其范围限定为该 Activity)。

此方法具有以下优势:

  1. Activity 不需要执行任何操作,也不需要对此通信有任何了解。
    2.除了 SharedViewModel 约定之外,Fragment 不需要相互了解。如果其中一个 Fragment 消失,另一个 Fragment 将继续照常工作。
    3.每个 Fragment 都有自己的生命周期,而不受另一个 Fragment 的生命周期的影响。如果一个 Fragment 替换另一个 Fragment,界面将继续工作而没有任何问题。

相关文章

  • Jetpack-ViewModel

    Jetpack-Lifecycle Jetpack-LiveData ViewModel ViewModel是以能...

  • Jetpack-ViewModel

    作用: 数据容器 特点: 1.单一职责,将数据从业务中抽离出来。2.生命周期长,存在于所属对象(Activity,...

  • Android Jetpack-ViewModel

    一、概述 为什么需要ViewModel或者说ViewModel的优势是什么? 如果Activity或者Fragme...

  • Jetpack-ViewModel源码解析

    官方文档:https://developer.android.com/topic/libraries/archit...

  • Jetpack-ViewModel源码分析

    ViewModel简介 1. Activity或Fragment有自己的生命周期被Framework所管理,Fra...

  • 4. Jetpack-ViewModel

    简介 概念: ViewModel 是以生命周期的方式存储和管理界面相关的数据,可以让数据在发生屏幕旋转等配置更改后...

  • Jetpack-ViewModel源码解析

    ViewModel源码解析 源码版本:ViewModel:2.4.0Android:31androidx.acti...

  • 05 Jetpack-ViewModel & LiveData&

    Android Jetpack组件推荐的使用项目架构 上面架构组件的功能如下: Activity和Fragment...

  • Jetpack-ViewModel原理解析

    一、ViewModel介绍 ViewModel 作为 Jetpack 组件库首屈一指的高频组件之一,ViewMo...

网友评论

      本文标题:Jetpack-ViewModel

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