如何将协程返回的Deferred<List>转为List?兼询LiveData获取列表方法
问题解决
一、解决Deferred到List的类型不匹配问题
你的代码里用viewModelScope.async会返回Deferred<List<MovieLocalModel>>,直接返回就会类型不匹配,有两种解决方式:
1. 无需async,直接调用挂起函数
因为getMovieList本身就是suspend函数,内部可以直接调用其他挂起函数(假设dbRepository.getMovie()是挂起函数),不需要额外用async包裹,修改代码如下:
suspend fun getMovieList(): List<MovieLocalModel> { return dbRepository.getMovie().toList() }
2. 若需使用async(并行场景),调用await()获取结果
如果有并行执行多个挂起任务的需求,保留async后,需要调用Deferred的await()方法(这是个挂起函数,可在suspend函数内直接调用)来拿到实际的列表:
suspend fun getMovieList(): List<MovieLocalModel> { val deferredList = viewModelScope.async { dbRepository.getMovie().toList() } return deferredList.await() }
二、从LiveData获取列表的方法
如果使用Room作为数据库框架,Room支持直接返回LiveData<List<MovieLocalModel>>,无需协程即可自动监听数据变化:
1. Repository层定义方法
fun getMovieLiveData(): LiveData<List<MovieLocalModel>> { return movieDao.getAllMovies() // Room DAO中定义返回LiveData的查询方法 }
2. ViewModel层持有LiveData
val movieListLiveData = dbRepository.getMovieLiveData()
3. 在UI层观察LiveData
viewModel.movieListLiveData.observe(this) { movieList -> // 在这里处理获取到的电影列表,比如更新UI }
内容的提问来源于stack exchange,提问作者Alex20280
相关产品推荐
相关产品推荐

