如何使用Android的架构组件完成ViewModel的活动?

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)

Blc*_*knx 5

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

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

我尝试用WeakReferences 来实现观察者模式。这是不稳定的。以不可预测的方式WeakReference丢失了 ( null)的所指对象,在这种情况下,无法调用finish(). 这很令人惊讶,因为我认为该活动在运行时不会被垃圾收集。

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

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