【问题标题】:how to use viewmodel singleton for activities?如何使用 viewmodel 单例进行活动?
【发布时间】:2020-11-18 16:03:11
【问题描述】:

MyApp 需要在整个上下文中持有一个 User 对象,A,B,C 活动的xml 使用这个User 对象,当A 编辑用户时,我想要B 和C 通知更改,如何处理数据绑定、livedata 和viewModel 的这个问题?

之前我让User.class扩展BaseObservable,但是POJO会很麻烦,不能为null,有时User可能为null比如没有登录。 现在我改为使用 LiveData,使 Pojo 变得简单而不是扩展 BaseObservable,但是当 A 编辑,B 和 C 不起作用时,我认为我需要 ABC 在内存中使用相同的 viewModel 实例,但这会导致 viewModel 的 onClear() 多次触发。

【问题讨论】:

  • 您可以自定义ViewModelFactory以使用单色ViewModel。
  • 它并不像this blog post 所暗示的那么可怕,但ViewModel 确实为粗心的人带来了一些陷阱。您的问题很难理解,但听起来您可能陷入了其中一个陷阱。
  • @Jeel Vankhede,我发现github.com/googlesamples/android-architecture-components/issues/…viewModel的onCleared()中的ViewModelFactory解决方案可能触发3次以上

标签: android android-livedata


【解决方案1】:

另一种方法是拥有一个单例存储库来保存您的用户数据,每个 viewModel 都可以拥有该存储库并在活动之间共享相同的数据。

【讨论】:

    【解决方案2】:

    根据这部分文档: https://developer.android.com/topic/libraries/architecture/livedata#extend_livedata

    LiveData 对象可感知生命周期这一事实意味着您可以在多个活动、片段和服务之间共享它们。为了使示例简单,您可以将 LiveData 类实现为单例,如下所示:

    您可以像我在这里所做的那样为您的视图模型创建一个单例:

        companion object{
            private lateinit var instance: ViewModelProfile
            
            @MainThread
            fun getInstance(userId: String): ViewModelProfile{
                instance = if(::instance.isInitialized) instance else ViewModelProfile(userId)
                return instance
            }
        }
    

    然后我调用它并像这样在任何地方获取实例:

        val profileVModel = ViewModelProfile.getInstance(user.uid)
    

    【讨论】:

      【解决方案3】:

      如果你想在 ABC Activity 之间共享通用的 ViewModel,那么建议将它们作为 3 个 Fragment 放在一个 Activity 中,创建该 Activity 的 ViewModel 可以在所有 3 个 Fragment A、B 和 C 之间共享。

      另外,您尝试通过活动实现的目标是这样的,假设您在活动 A 中做了一些操作,如果您希望活动 B 和 C 收到有关它们的通知,那么它们需要运行才能获得通知,这赢了不会发生,因此您应该使用IntentBundle 在活动开始时传递所需的信息。

      更新

      还有其他方法可以实现类似的功能,例如,

      • 事件总线
      • RxJava 主题(参考this
      • Evernote 的 Android 状态(参考 this

      这将允许您对状态进行应用程序级别的访问,任何 Activity 或 Fragment 都可以访问该状态

      【讨论】:

      • Evernote 的 Android 状态不再维护。
      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2017-10-18
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      相关资源
      最近更新 更多