observeForever生命周期是否知道?

问题描述 投票:3回答:3

我正在使用MVVM,并且已经对其进行了不同的实现,但是仍然令我怀疑的一件事是,如何在不将任何生命周期附加到ViewModel的情况下,从ViewModel的存储库(Firebase)中获取数据。

我已经从ViewModel实现了observeForever(),但是我认为这不是一个好主意,因为我认为我应该使用回调或Transformation从存储库向ViewModel进行通信。

我在这里留下一个示例,其中我从Firebase获取设备并更新我的UI,如果可以在此处看到,我正在观察来自UI回购的数据,但是从ViewModel中,我还观察了来自回购,这是我真正怀疑是否使用正确方法的地方,因为我不知道如果我的视图被破坏了,是否会在observeForever()上清除onCleared(),所以它不会保留观察者如果视图消失,则还活着。

UI

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}"
        })

ViewModel

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)获取数据。

android kotlin mvvm android-livedata android-architecture-components
3个回答
2
投票

要使用ObserveForever,您需要在ViewModel的onClear内部删除观察者。


1
投票

observeForever()不支持生命周期,它将继续运行直到调用removeObserver()。在您的ViewModel中,改为执行此操作,


0
投票

observeForever生命周期是否知道?

© www.soinside.com 2019 - 2024. All rights reserved.