在我的应用程序中,我从 api 获取数据并将其保存在 Room 数据库中。从 api 获取数据并直接在适配器中显示它工作正常。
但是在没有互联网连接的情况下,我使用协程从数据库中获取数据。这里的问题是我从数据库成功获取了数据,但它没有在适配器中更新。我尝试在获取数据后调用 notifyDataSetChanged,但仍然没有在 UI 上显示任何内容。
我还注意到一个奇怪的事情是,如果我在调试模式下运行应用程序并检查所有代码,它会在调试停止时在适配器中显示列表。
下面是从数据库中获取数据并将其添加到适配器中的代码。
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
if (isInternetAvailable()) {
if (jobsList.size == 0) {
getJobs()
}
}else{
GlobalScope.launch {
jobsList.addAll(dataBaHelperImpl.getJobs())
}
jobsViewModel.setJobsList(jobsList)
}
}
ViewModel setJobList 方法
fun setJobsList(orderList: ArrayList<Jobs>){
jobsAdapter.setItems(orderList)
jobsAdapter.notifyDataSetChanged()
}
答案 0 :(得分:2)
GlobalScope.launch
不是阻塞调用所以你需要等待它完成然后你可以调用 jobsViewModel.setJobsList(jobsList)
。
您不应该使用 Global Scope。
有很多方法可以解决这个问题,
您可以将此调用移至 ViewModel
并直接使用 viewModelScope.launch
并收听 LiveData
,因为 android room 内部支持协程,您不必提供 IO 调度程序。类似于下面的东西。
val jobLiveData=MutableLiveData<List<Jobs>>()
fun getJobs() {
viewModelScope.launch {
jobLiveData.value= dataBaHelperImpl.getJobs()
}
}