Проблема связана с необходимостью владельца жизненного цикла , используемого для наблюдений за LiveData в репозитории.
Во-первых, вы не хотите возвращать новый LiveData<LoadingStatus>
каждый раз, когда вызывается fetchMore()
. Это будет создавать новые LiveData каждый раз. В лучшем случае вы бы хотели, чтобы функция fetchMore()
выполняла что-то вроде этого, обновляя одну LiveData:
Repository{
val status = LiveData<LoadingStatus>()
fun fetchMore() {
status.postValue(LOADING)
// Pseudo code for actually loading more items
status.postValue(FINISHED LOADING)
}
}
Однако у вас возникнет проблема наблюдения status
с ViewModel
, поскольку он сам не является реализацией жизненного цикла, поэтому он не может легко наблюдать LiveData из репозитория.
Мое предложение будет примерно таким:
ViewModel{
val loadingStatus: MutableLiveData<LoadingStatus>
init{
repository.observeStatus()
.subscribe( event -> loadingStatus.postValue(event))
}
fun getMoreData(){
repository.fetchMore()
}
}
Repository{
val status = BehaviorSubject.create<LoadingStatus>()
fun observeStatus(): Observable<LoadingStatus> {
return status
}
fun fetchMore(){
status.onNext(LOADING)
// Pseudo code for actually loading more items
status.onNext(FINISHED LOADING)
}
}
Fragment{
viewModel.loadingStatus.observe()
}
Обратите внимание, что вам придется избавиться от подписки в ViewModel onCleared.
Обратите внимание, что все это псевдокод, и его следует делать намного чище, чем этот.