带有 CoroutineScope 的边界回调(Android 分页库)

Sam*_*ari 6 android kotlin android-viewmodel kotlinx.coroutines android-paging

我试图实现Android Paging libraryViewModelKotlin Coroutines

我有一个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()
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我的Repository. 我注入BoundaryCallbackKodeinDependecy注射器。

class MovieRepositoryImpl(
    private val movieDao: MovieDao,
    boundaryCallback: MovieBoundaryCallback
) : MovieRepository {

    override suspend fun getMovies(): DataSource.Factory<Int, MovieBrief> {
        return movieDao.getMovies()
    }

    override val movieBoundaryCallback = boundaryCallback

}
Run Code Online (Sandbox Code Playgroud)

BoundaryCallback类内部onItemAtEndLoaded调用RESTAPI,然后将数据保存到Room数据库中(都是挂起函数)。所以我必须访问我的 ViewModel 的协程范围。实现这一目标的最佳实践是什么?

谢谢

Sam*_*ari 1

分页库 版本 3现已推出并支持Coroutine. PagedList.BoundaryCallback现在Deprecated,对于这种情况,我们需要使用它RemoteMediator,它有一个suspend fun load用于处理Remote+Local分页