【发布时间】:2018-12-31 11:36:44
【问题描述】:
我正在尝试用ViewModel 和Kotlin Coroutines 实现Android Paging library
我有一个实现CoroutineScope 的ViewModel。这取决于Repository:
class MovieListViewModel(
private val movieRepository: MovieRepository
) : ViewModel(), CoroutineScope {
private val job = Job()
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.IO
private lateinit var _movies: LiveData<PagedList<MovieBrief>>
val movies: LiveData<PagedList<MovieBrief>>
get() = _movies
init {
launch {
_movies = LivePagedListBuilder(movieRepository.getMovies(), DATABASE_PER_PAGE)
.setBoundaryCallback(movieRepository.movieBoundaryCallback)
.build()
}
}
}
这是我的Repository。我用Kodein Dependecy Injector 注入BoundaryCallback。
class MovieRepositoryImpl(
private val movieDao: MovieDao,
boundaryCallback: MovieBoundaryCallback
) : MovieRepository {
override suspend fun getMovies(): DataSource.Factory<Int, MovieBrief> {
return movieDao.getMovies()
}
override val movieBoundaryCallback = boundaryCallback
}
BoundaryCallback 类内部 onItemAtEndLoaded 调用 RESTAPI,然后将数据保存到 Room 数据库(两者都是挂起函数)。所以我必须访问我的 ViewModel 的协程范围。实现这一目标的最佳做法是什么?
谢谢
【问题讨论】:
-
你找到解决办法了吗?我对我现在的不满意
-
@NoushadHasan 到现在还没有,需要通过方法/构造函数注入来传递作用域
-
你的存储库不应该让协程范围来完成它的工作(既然是别人的范围,为什么会呢?)。我认为您的问题出现是因为您使用不同的范例来获取数据:协程和回调。我建议使用suspendCoroutine(或
suspendCancelableCoroutine将您的回调提供程序转换为提供暂停功能,以便您可以轻松地在视图模型中使用它。 -
@AdibFaramarzi 你能解释更多吗?没看懂
标签: android kotlin kotlinx.coroutines android-viewmodel android-paging