android - 如何使用 Android 的架构组件从 ViewModel 完成 Activity ?

标签 android android-architecture-components

我试图弄清楚如何以最佳方式从 ViewModel 完成 Activity。我找到了一种使用 LiveData 对象并发出“信号”的方法。

我怀疑这个解决方案有开销。那么这是正确的解决方案还是我应该使用更准确的方法?

举个例子:假设在一个应用程序中有一个 Activity MainActivity 和 View 模型,如下所示:

 class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val model = ViewModelProviders.of(this).get(MainViewModel::class.java)

        model.shouldCloseLiveData.observe(this, Observer { finish() })

    }
 }

作为 MainActivity 的伴侣是如下所示的 MainViewModel:

class MainViewModel(app: Application) : AndroidViewModel(app) {

  val shouldCloseLiveData = MutableLiveData<Void>()

  fun someAction(){
    shouldCloseLiveData.postValue(null)
  }

}

最佳答案

我和你一样认为这个解决方案看起来不整洁有两个原因。 首先使用MutableLiveData 对象来发出事件信号是一种变通方法。没有数据被改变。 其次将 LiveData 暴露在 View 模型的外部通常违反了封装的原则。

我仍然对android这个丑陋的概念感到惊讶。他们应该提供一个选项来观察 View 模型而不是它的内部 LiveData 对象。

我尝试使用 WeakReference 来实现观察者模式。这是不稳定的。 WeakReference 的引用以不可预知的方式丢失(null),在这种情况下无法调用 finish()。这令人惊讶,因为我不认为 Activity 在运行时被垃圾收集。

所以这是排除的部分答案。作为 WeakReference 实现的观察者模式似乎无法替代您的建议。

如果我在 onStop()onDestroy() 期间删除引用,想知道通过硬引用实现观察者模式是否合法。我问了这个问题here .

关于android - 如何使用 Android 的架构组件从 ViewModel 完成 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49077746/

相关文章:

android - 从 ViewModel 访问 strings.xml

android - 类型不匹配 : inferred type is LoginActivity but LifecycleOwner was expected

android - 我们可以将 android.app.Service 作为生命周期感知组件吗

Android 架构组件 ViewModel - 如何在测试 Activity 上模拟 ViewModel?

android - 我的Android移动应用程序无法在android电视上运行

android - 使用导航组件时关闭 DialogFragment 的正确方法?

android - Firebase java对象序列化和继承

android - 权限拒绝 : not allowed to send broadcast in android

android - 在android中设置每年重复闹钟

android - YouTubePlayerSupportFragment 显示网络错误 400