Android LiveData Observer не активен после первого обновления

Я пытаюсь выполнить базовую реализацию Live Data Data Component с Kotlin следующим образом:

class MarketFragment : LifecycleFragment(){ ...... override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewModel=ViewModelProviders.of(this).get(MarketViewModel::class.java) viewModel.book?.observe(this, Observer { book-> //updateUI }) .... 

Мой класс ViewModel создается следующим образом:

 class MarketViewModel : ViewModel() { var book: MutableLiveData<Book>? =MutableLiveData() var repository: Repository?= Repository() init { update("parameter") } fun update(s: String) { book=repository?.getBook(s) } } 

И мой репозиторий:

 fun getBook(bookSymbol:String):MutableLiveData<Book> { val book=MutableLiveData<Book>() ...... call . enqueue (object : Callback<Book> { override fun onResponse(call: Call<Book>?, response: Response<Book>?) { book.value=response?.body() } ..... }) return book } 

}

И все это отлично работает, и пользовательский интерфейс обновляется по мере необходимости, но только в первый раз. Если я попытаюсь выполнить ручные вызовы, чтобы обновить viewModel от действия пользовательского интерфейса, то запрос на доработку по-прежнему работает так, как ожидалось, но новые данные не отправляются Наблюдателю во Фрагменте:

 //this doesn't work: viewModel.update("string") //This returns false: viewModel.book.hasActiveObservers() 

Ожидается ли, что ожидаемое поведение наблюдателя станет неактивным после первого триггера?

Вы создаете новый экземпляр MutableLiveData каждый раз, когда вы вызываете getBooks

Следовательно, ваш наблюдатель больше не наблюдает за правильным LiveData .

Чтобы решить эту проблему, ваш ViewModel должен хранить только один экземпляр MutableLiveData и публиковать обновления, используя функцию postValue .

Затем репозиторий может использовать RxJava (Flowable) для выполнения запроса в фоновом потоке и возврата Observable<Book> (или Single<Book> )

Intereting Posts
android.R.id просмотр привязки в Котлине Является ли Kotlin 100% совместимым с ART на Android? Gson не может анализировать данные формата json формата в Kotlin Как создать экземпляр универсального класса, передающего ссылку метода в конструкторе с kotlin Итерирование по файлам, разбиение по шаблону Как заставить Джексона использовать параметры по умолчанию для Kotlin для отсутствующих значений? Как получить вход от пользователя в Android Studio в числовом значении и преобразовать его в переменную int в kotlin? LocalDateTime в IntelliJ IDEA Котлин показывает как нерешенную ссылку Конструктор по умолчанию для IntentService (kotlin) Kotlin – Как установить время ожидания соединения с OkHttp Kotlin Отладка встроенных функций Kotlin Работает ли KAnnotator в Android Studio? Почему невозможно использовать ссылки на методы `suspend` в Kotlin? Невозможно найти сеттер для поля – используя базу данных Kotlin с комнатой Почему добавление представления в мой макет меняет ширину всего макета?