Lun*_*lpo 13 android android-architecture-components
我试图弄清楚如何以最佳方式完成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() })
}
}
Run Code Online (Sandbox Code Playgroud)
并且作为MainActivity的伴侣是MainViewModel,如下所示:
class MainViewModel(app: Application) : AndroidViewModel(app) {
val shouldCloseLiveData = MutableLiveData<Void>()
fun someAction(){
shouldCloseLiveData.postValue(null)
}
}
Run Code Online (Sandbox Code Playgroud)
我和你一样觉得这个解决方案看起来不整洁,原因有两个。首先使用MutableLiveData对象来发出事件信号是一种解决方法。没有数据被改变。二次将LiveData暴露在视图模型之外违反了封装原则通常。
我仍然对 android 这个丑陋的概念感到惊讶。他们应该提供一个选项来观察视图模型而不是它的内部LiveData对象。
我尝试用WeakReferences 来实现观察者模式。这是不稳定的。以不可预测的方式WeakReference丢失了 ( null)的所指对象,在这种情况下,无法调用finish(). 这很令人惊讶,因为我认为该活动在运行时不会被垃圾收集。
所以这是排除的部分答案。观察者模式实现为WeakReference似乎无法替代您的建议。
想知道通过硬引用实现观察者模式是否合法,如果我在onStop(), 或期间删除引用onDestroy()。我在这里问了这个问题。
| 归档时间: |
|
| 查看次数: |
2766 次 |
| 最近记录: |