最近选择使用LiveData,在初始化变量时遇到问题。我有2个活动(我不使用导航,但不是重点):
问题是,我需要能够在创建模式下查阅Detail Activity,即,在我的ViewModel中,不得通过Retrofit来检索对象,而必须通过新的实例化来创建对象。
这是现在完成的方式:
详细活动:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.details)
val isNew = intent.extras?.getBoolean("new")
if (isNew) {
// Trigger lazy property
viewModel.value
} else {
viewModel.getDetails()
}
presenter.value.observe(this, Observer { value ->
value?.let {
displayDetails(it)
}
})
}
ViewModel
class DetailsPresenter(private val repository: WorkOrderRepository)
: ViewModel(), LifecycleObserver {
val value: MutableLiveData<Details> by lazy { MutableLiveData(Details("")) }
fun getDetails() {
RetrofitClient.getDetails()
.onSuccess {
this.value.value = it
}
}
}
此方法的问题是我的displayDetails()方法被调用了两次。一个用于延迟初始化,另一个用于我正在查看现有项目的情况。
稍后如何在代码中初始化LiveData?
当然,它将被调用两次,第一次调用是因为您在View中注册了一个观察者,这使得lazy
可以工作并创建LiveData
对象。第二次调用它是因为Retrofit更新了LiveData
对象。您是在发出网络请求,它们总是要花一些时间才能完成,直到那时,您的程序在等待请求完成的同时开始执行下一行(在您的情况下是设置观察器)。
如果不考虑value
条件,则懒惰地初始化if-else
对象没有任何意义。
我将在ViewModel的init
块中进行改造调用并将其缓存在其中。