android - 如何在观察者之外访问 LiveData 相关对象?
问题描述
我正在制作一个使用房间和 Livedata 来存储和显示数据的应用程序,我可以毫无问题地创建和删除单个项目,但我正在努力创建一个更新值的过程。
问题是我需要在观察者之外访问与 LiveData 对象相关的对象以更改对象值并使用视图模型更新它,但是当我尝试使用 LiveData.value 时,我总是在观察者之外得到一个 null 和一个有效的观察者内部的对象(我用吐司和零食来展示这个,你可以在下面的代码中看到)。
那么,如何在观察者之外访问或更新与 LiveData 相关的对象?
if(intent.hasExtra("MEDICINE_ID")){
title = getString(R.string.editar_medicamento)
medicamentoActualLive = medicamentoViewModel.getMedicamento(intent.getIntExtra("MEDICINE_ID",-1))
medicamentoActualLive.observe(this, android.arch.lifecycle.Observer {
CampoNombreComercial.setText(it!!.nombreMedicamento,TextView.BufferType.EDITABLE)
CampoNombreGenerico.setText(it!!.nombreGenerico,TextView.BufferType.EDITABLE)
CampoDosis.setText(it!!.dosis,TextView.BufferType.EDITABLE)
CampoNota.setText(it!!.nota,TextView.BufferType.EDITABLE)
val MedicineTypeIndex = this.resources.getStringArray(R.array.TipoMedicamento).indexOf(it!!.tipo)
SpinnerTipoMedicamento.setSelection(MedicineTypeIndex)
MedicamentoIconoTV.setColorFilter(it.color!!)
mCurrentPhotoPath = it.fotografia!!
displayPic()
medicamento = it
Toast.makeText(this@AnadirMedicamentoActivity,"El valor del medicamento live es: " + medicamento.nombreGenerico, Toast.LENGTH_SHORT).show()
})
Snackbar.make(LayoutConstrain,"El valor del medicamento live externo: " + medicamentoActualLive.value?.nombreGenerico, Snackbar.LENGTH_SHORT).show()
}else{
title = getString(R.string.AnadirMedicamento)
}
保存或更新过程是在浮动操作按钮的 onClick 方法中调用的这个函数中进行的:
private fun saveMedicineToDB(medicamento: Medicamento){
if(intent.hasExtra("USER_ID")){
medicamentoViewModel.update(medicamento)
}else{
medicamentoViewModel.insert(medicamento)
}
setResult(Activity.RESULT_OK)
finish()
}
解决方案
我找到了解决这个问题的方法,因为评论说由于异步查询我无法访问 LiveData 对象数据,但我可以从 UI 事件(在这种情况下为 onClick 事件)访问,这是我的解决方案:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val establecimiento : Establecimiento
if(intent.hasExtra("ESTABLISHMENT_ID")){
establecimiento = establecimientoActualLive.value!!
}else{
establecimiento = Establecimiento(0)
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this@AnadirEstablecimientoActivity)
val usuarioID = sharedPref.getInt("actualUserID",-1)
establecimiento.usuarioID = usuarioID
}
when (item.itemId) {
R.id.itemSave -> {
establecimiento.nombre = NombreEstablecimientoTV.text.toString()
establecimiento.tipo = tipoEstablecimiento
establecimiento.direccion = DireccionEstablecimientoTV.text.toString()
establecimiento.telefono1 = Telefono1EstablecimientoTV.text.toString()
establecimiento.telefono2 = Telefono2EstablecimientoTV.text.toString()
establecimiento.email = EmailEstablecimientoTV.text.toString()
establecimiento.sitioWeb = SitioWebEstablecimeintoTV.text.toString()
establecimiento.latitud = latitud
establecimiento.longitud = longitud
if(establecimiento.usuarioID != -1){
saveEstablishmentToDB(establecimiento)
}
return true
}
android.R.id.home -> {
onBackPressed()
return true
}
}
return super.onOptionsItemSelected(item)
}
推荐阅读
- python - ImportError:无法导入名称 MapTile
- flutter - Flutter 目录不是 GitHub 项目的克隆
- sql-server - TSQL 2012 服务器数据类型错误消息 varchar 转换浮点数(仅 SUM 值)
- mysql - Nginx Puma 和 Rails 5 负载测试失败
- python - 如果在池中定义的 greenlet 中没有捕获异常会发生什么?
- java - Javac 工作 java 不工作
- jquery - 切换 onClick 功能
- drupal - 错误:在standard_form_install_configure_submit() 中调用null 时的成员函数setRecipients()
- opencv - pylab imshow 颜色未完全显示
- javascript - jQuery 日期选择器。2个日期选择器。限制范围:从所选开始日期起最多 2 周的日期