如何使用viewmodel单例进行活动?

时间:2018-10-29 05:31:10

标签: android android-livedata

MyApp需要在整个上下文中保存一个User对象,A,B,C活动的xml使用此User对象,当A编辑一个User时,我想要B和C notifyChange,如何用数据绑定,livedata和viewModel处理此问题?

以前,我使User.class扩展BaseObservable,但是POJO会很麻烦,并且不能为null,有时User可能为null,例如未登录。 现在我更改为使用LiveData,使Pojo简单而不扩展BaseObservable,但是当A edit,B和C无法正常工作时,我认为我需要ABC在内存中使用相同的viewModel实例,但这将导致viewModel的onClear()多次触发。 / p>

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

如果要在ABC活动之间共享通用的ViewModel,则建议将它们作为3个片段保留在单个Activity中,创建该活动的ViewModel,可以在A,B和C的所有三个片段之间共享。< / p>

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

已更新

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

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

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

答案 2 :(得分:0)

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