【问题标题】:Boundary Callback (Android Paging Library) with CoroutineScope使用 CoroutineScope 的边界回调(Android 分页库)
【发布时间】:2018-12-31 11:36:44
【问题描述】:

我正在尝试用ViewModelKotlin Coroutines 实现Android Paging library

我有一个实现CoroutineScopeViewModel。这取决于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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 2018-10-31
    • 2020-04-20
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多