Intereting Posts
Делегат Kotlin с MultiDex на Android ниже 21 Не удалось получить неизвестное свойство «anko_version» для объекта типа …? Java 2-минутная задержка иногда при подключении сокета? Kotlin – Понимание Getters и Setters Дженерики в Котлине с расширением Набор членов класса (значение) вызывается рекурсивно … почему? Передача параметров пользовательскому получателю в котлин Escape $ {something} в строчке Котлина Использование Kotlin в библиотечном модуле без использования его в модуле приложения Mockito / Powermock не работает должным образом с Kotlin Как заменить FrameLayout фрагментом на Kotlin на Android Как я могу получить значение (объект) свойства ресурса? Как установить параметры макета в imageView внутри GridView в Android Котлин: вторичный конструктор с этим ключевым словом Невозможно сделать API-адрес urlfetch.Fetch в потоке, который не является ни потоком исходного запроса, ни потоком, созданным ThreadManager

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