使用 CoroutineScope 的边界回调(Android 分页库)
Boundary Callback (Android Paging Library) with CoroutineScope
我正在尝试使用 ViewModel
和 Kotlin Coroutines
实现 Android Paging library
我有一个 ViewModel
实现了 CoroutineScope
。这取决于 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
依赖注入器注入 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
class onItemAtEndLoaded
调用RESTAPI,然后将数据保存到Room数据库(都是挂起函数)。所以我必须访问我的 ViewModel 的协程范围。实现此目标的最佳做法是什么?
谢谢
分页库 版本 3 现已可用并支持 Coroutine
。
PagedList.BoundaryCallback
现在是 Deprecated
,对于这种情况,我们需要使用 RemoteMediator
,它有一个 suspend fun load
来处理 Remote+Local
分页
我正在尝试使用 ViewModel
和 Kotlin Coroutines
Android Paging library
我有一个 ViewModel
实现了 CoroutineScope
。这取决于 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
依赖注入器注入 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
class onItemAtEndLoaded
调用RESTAPI,然后将数据保存到Room数据库(都是挂起函数)。所以我必须访问我的 ViewModel 的协程范围。实现此目标的最佳做法是什么?
谢谢
分页库 版本 3 现已可用并支持 Coroutine
。
PagedList.BoundaryCallback
现在是 Deprecated
,对于这种情况,我们需要使用 RemoteMediator
,它有一个 suspend fun load
来处理 Remote+Local
分页