我尝试使用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,则改装调用仍然按预期工作,但新数据不会发送到片段中的Observer:
//this doesn't work:
viewModel.update("string")
//This returns false:
viewModel.book.hasActiveObservers()
观察者在第一次触发后变为非活动状态的预期行为是什么?
答案 0 :(得分:7)
每次调用getBooks
因此,您的观察者不再观察右LiveData
。
解决这个问题
您的ViewModel应该只保留一个MutableLiveData实例,并使用postValue
函数
然后,存储库可以使用RxJava(Flowable)在后台线程上执行查询并返回Observable<Book>
(或Single<Book>
)