首次更新后,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>
)