Intereting Posts
Как использовать kotlin для определения класса приложения Android? jvm сравнение String с StringBuffer.reverse () всегда не выполняется Невозможно запустить глобальное приложение hello, как показано в O'Reilly – Введение в программирование Kotlin Klaxon: Ожидалось имя, но получил LEFT_BRACE Как переопределить метод при создании объекта в Котлине? AndroidStudio / Kotlin – Неразрешенная ссылка: ReadWriteProperty – Kotlin версия 1.0.0-beta-1038 Как экспортировать функции Kotlin в Javascript с правильным именем Свойства расширения Kotlin, не распознанные в V1.0.1 Повторение текстуры в области текстуры Доступ к TextView в пользовательском классе в Котлине Kotlin `shl` не работает Переустановите 2 POST XML и получите ответ JSON от API. с Котлином Kotlin: Как можно получить доступ к функциям расширения внутри одного типа извне? Создание экземпляра фрагмента в котлине Каков самый быстрый или простой способ расчета скользящего среднего в Котлине?

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