我尝试找出如何以最佳方式从 ViewModel 完成 Activity。我找到了使用 LiveData 对象并发出“信号”来执行此操作的一种方法。
我怀疑这个解决方案是否有开销。那么这是正确的解决方案还是我应该使用更准确的解决方案?
来看示例:假设应用程序中有一个活动 MainActivity 和视图模型,如下所示:
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)
}
}
我同意您的感受,即该解决方案看起来不整洁有两个原因。First用一个MutableLiveData
对象发出事件信号是一种解决方法。没有数据被改变。Second将 LiveData 暴露给视图模型的外部违反了以下原则封装一般来说。
我仍然对 Android 这个丑陋的概念感到惊讶。他们应该提供一个选项来观察视图模型而不是它的内部LiveData
对象。
我尝试过WeakReference
s 来实现观察者模式。这是不稳定的。以不可预测的方式,WeakReference
丢失了 (null
),在这种情况下无法调用finish()
。这很令人惊讶,因为我认为该活动在运行时不会被垃圾收集。
所以这是排除法的部分答案。观察者模式实现为WeakReference
似乎无法替代你的建议。
不知道如果我在期间删除引用,通过硬引用实现观察者模式是否合法onStop()
, or onDestroy()
。我问了这个问题here https://stackoverflow.com/questions/50000975/am-i-allowed-to-observe-a-viewmodel-if-i-clean-up-the-back-references.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)