Android LiveData Observer 在第一次更新后未激活
Android LiveData Observer not active after first update
我正在像这样使用 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 是这样创建的:
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()
Observer 在第一次触发后变为非活动状态是预期的行为吗?
您每次调用时都在创建一个新的 MutableLiveData 实例 getBooks
因此你的观察者不再观察右边的 LiveData
。
解决这个问题
- 您的 ViewModel 应该只保留一个(不可变的)LiveData 实例
那个不可变的 LiveData 实例可以是:
- 一个 MediatorLiveData,来源是存储库的 LiveData
- 存储库 LiveData 的转换
这意味着存储库方法 getBooks
仅在 ViewModel 初始化时调用一次,并且它会自行刷新,或者您必须在存储库上调用另一个方法来触发刷新。
我正在像这样使用 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 是这样创建的:
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()
Observer 在第一次触发后变为非活动状态是预期的行为吗?
您每次调用时都在创建一个新的 MutableLiveData 实例 getBooks
因此你的观察者不再观察右边的 LiveData
。
解决这个问题
- 您的 ViewModel 应该只保留一个(不可变的)LiveData 实例
那个不可变的 LiveData 实例可以是:
- 一个 MediatorLiveData,来源是存储库的 LiveData
- 存储库 LiveData 的转换
这意味着存储库方法 getBooks
仅在 ViewModel 初始化时调用一次,并且它会自行刷新,或者您必须在存储库上调用另一个方法来触发刷新。