我正在使用MVVM,并且已经对其进行了不同的实现,但是仍然令我怀疑的一件事是,如何在不将任何生命周期附加到ViewModel的情况下,从ViewModel的存储库(Firebase)中获取数据。
我已经从ViewModel实现了observeForever()
,但是我认为这不是一个好主意,因为我认为我应该使用回调或Transformation从存储库向ViewModel进行通信。
我在这里留下一个示例,其中我从Firebase获取设备并更新我的UI,如果可以在此处看到,我正在观察来自UI回购的数据,但是从ViewModel中,我还观察了来自回购,这是我真正怀疑是否使用正确方法的地方,因为我不知道如果我的视图被破坏了,是否会在observeForever()
上清除onCleared()
,所以它不会保留观察者如果视图消失,则还活着。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val deviceId = editText.text.toString().trim()
observeData(deviceId)
}
}
fun observeData(deviceId:String){
viewModel.fetchDeviceData(deviceId).observe(this, Observer {
textView.text = "Tipo: ${it.devType}"
})
class MainViewmodel: ViewModel() {
private val repo = Repo()
fun fetchDeviceData(deviceId:String):LiveData<Device>{
val mutableData = MutableLiveData<Device>()
repo.getDeviceData(deviceId).observeForever {
mutableData.value = it
}
return mutableData
}
}
class Repo {
private val db = FirebaseDatabase.getInstance().reference
fun getDeviceData(deviceId:String):LiveData<Device>{
val mutableData = MutableLiveData<Device>()
db.child(deviceId).child("config/device").addListenerForSingleValueEvent(object: ValueEventListener{
override fun onDataChange(dataSnapshot: DataSnapshot) {
val device = dataSnapshot.getValue(Device::class.java)
mutableData.value = device
}
override fun onCancelled(dataError: DatabaseError) {
Log.e("Error","handle error callback")
}
})
return mutableData
}
}
[此示例仅说明如何从Firebase提取设备,它可以工作,但是从我的ViewModel中,一直让我认为observeForever()
不是我想要的在存储库与ViewModel之间进行数据通信的东西。 >
我已经看到了Transformations
,但是在这种情况下,我只需要将整个Device对象交付给我的UI,因此不需要将要检索的对象转换为另一个对象
这里应该采用什么正确的方法来正确地传达存储库和ViewModel?
[我正在使用MVVM,并且已经对其进行了不同的实现,但是让我仍然怀疑的一件事是,如何在没有...的情况下从我的ViewModel中从存储库(Firebase)获取数据。
要使用ObserveForever,您需要在ViewModel的onClear内部删除观察者。
observeForever()
不支持生命周期,它将继续运行直到调用removeObserver()
。在您的ViewModel中,改为执行此操作,
observeForever生命周期是否知道?