使用 CoroutineScope 的边界回调(Android 分页库)

Boundary Callback (Android Paging Library) with CoroutineScope

我正在尝试使用 ViewModelKotlin 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 现已可用并支持 CoroutinePagedList.BoundaryCallback 现在是 Deprecated,对于这种情况,我们需要使用 RemoteMediator,它有一个 suspend fun load 来处理 Remote+Local 分页