我的应用程序中具有此功能:
fun bindUI() = launch(Dispatchers.Main){
val locationResults = locationViewModel.locationResponse
val owner = viewLifecycleOwner
locationResults.observe(owner, Observer {
if (it == null) return@Observer
// TODO: set loading icon to GONE
initRecyclerView(it.features.toLocationSearchResultListItem())
})
}
在应用程序中按下某个按钮时将触发此功能。调试代码时,locationResults字段设置为RoomTrackingLiveData对象,但是当它到达观察者内部的if条件时,it
为null,并且从函数中返回。在这种情况下,it
的类型为LocationSearchResponse!
,locationViewModel.locationResponse
的类型为LiveData<out LocationSearchResponse>
为什么it
在刚从几行之前从该变量正确检索结果后立即为空?
答案 0 :(得分:0)
Dispatcher.Main可能是UI线程,但是UI线程本身不具有活动和片段之类的视图生命周期。
您必须将视图模型绑定到片段或活动中,否则viewLifecycleOwner将为空。
考虑一下这是不可行的,因为您可能同时在屏幕上说了5个片段。它们全部在具有单独生命周期的UI线程上运行。您认为其中的女巫应该引用viewLifecycleOwner吗?
自从您说过,这是通过单击按钮运行的。只需删除协程,它应该可以工作。
如果您希望使用协程并使其具有生命周期意识,那么还有一个生命周期感知的协程范围'viewLifecycleOwner.lifecycleScope.launch'。但我真的不明白这一点。虽然有可能,但也许有一点意义,有人可以启发我。 ^^
好像不是@ianhanniballake表示LiveData的数据可能为空的问题。您可以使用locationResults.value
获取数据,或者在调试locationResults
时应包含一个字段mData
。那是后来的您的it
。