In der ViewModel- Dokumentation
ViewModel-Objekte dürfen jedoch niemals Änderungen an lebenszyklusbewussten Observablen wie LiveData-Objekten beobachten.
Eine andere Möglichkeit besteht darin, dass die Daten RxJava anstelle von LiveData implementieren. Dann haben sie nicht den Vorteil, dass sie den Lebenszyklus berücksichtigen.
In einem Google-Beispiel von todo-mvvm-live-kotlin wird in ViewModel ein Rückruf ohne LiveData verwendet.
Ich vermute, wenn Sie der gesamten Idee, Lebenszyklusware zu sein, entsprechen möchten, müssen wir den Beobachtungscode in Aktivität / Fragment verschieben. Andernfalls können wir in ViewModel Callback oder RxJava verwenden.
Ein weiterer Kompromiss besteht darin, MediatorLiveData (oder Transformationen) zu implementieren und in ViewModel zu beobachten (hier Ihre Logik einfügen). Beachten Sie, dass der MediatorLiveData-Beobachter nur dann ausgelöst wird (wie Transformationen), wenn er in Aktivität / Fragment beobachtet wird. Wir setzen eine leere Beobachtung in Aktivität / Fragment, wo die eigentliche Arbeit tatsächlich in ViewModel erledigt wird.
fun start(id : Long) : LiveData<User>? {
val liveData = MediatorLiveData<User>()
liveData.addSource(dataSource.getById(id), Observer {
if (it != null) {
}
})
}
viewModel.start(id)?.observe(this, Observer {
})
PS: Ich habe ViewModels und LiveData: Patterns + AntiPatterns gelesen , die Transformationen vorgeschlagen haben. Ich denke nicht, dass es funktioniert, wenn die LiveData nicht beobachtet werden (was wahrscheinlich erfordert, dass es bei Aktivität / Fragment durchgeführt wird).