我试图弄清楚如何以最佳方式从 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/