首次更新后,Android LiveData Observer无效

我正在尝试使用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 } 

}

所有这些工作都很好,而且UI也是应该更新的,只是第一次。 如果我尝试进行手动调用来从UI操作更新viewModel,则改进调用仍按预期工作,但新数据不会发送到片段中的观察器:

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

观察者在第一次触发后变为不活动的预期行为是什么?

每次调用getBooks时,都会创建一个新的MutableLiveData实例

因此你的观察者不再观察正确的LiveData

为了解决这个问题,你的ViewModel应该只保留一个MutableLiveData实例,并使用postValue函数发布更新。

然后,存储库可以使用RxJava(Flowable)在后台线程上执行查询,并返回一个Observable<Book> (或Single<Book>