Android 多次调用分页库中的回调

Android 多次调用分页库中的回调,android,kotlin,coroutine,android-paging,Android,Kotlin,Coroutine,Android Paging,在五月份的项目中,我正在使用Android架构组件中的分页库。从用作缓存的房间数据库读取数据,当到达列表末尾时,我使用边界回调从网络api获取新数据。不幸的是,当从api调用新的更新时,它会被调用4次或更多次,即使方法中有布尔标志,因此新数据是不正确的 从数据库返回Datasource.Factory: @Query("SELECT * FROM movieentity ORDER BY popularity DESC") fun allMovies(): DataSource.

在五月份的项目中,我正在使用Android架构组件中的分页库。从用作缓存的房间数据库读取数据,当到达列表末尾时,我使用边界回调从网络api获取新数据。不幸的是,当从api调用新的更新时,它会被调用4次或更多次,即使方法中有布尔标志,因此新数据是不正确的

从数据库返回Datasource.Factory:

    @Query("SELECT * FROM movieentity ORDER BY popularity DESC")
    fun allMovies(): DataSource.Factory<Int, MovieEntity>
@Query(“按人气描述从电影实体顺序中选择*)
fun allMovies():DataSource.Factory
存储库中的方法,基本上我想清除缓存并从api中引导下一页:

    override fun allMovies(movieBoundaryCallback: 
    MainViewModel.MovieBoundaryCallback): LiveData<PagedList<Movie>> {
        // Get data source factory from the local cache
        val dataSourceFactory = moviesDao.allMovies().map {
            MovieMapper.fromDb(
                it
            )
        }

        val config: PagedList.Config = PagedList.Config.Builder()
            .setInitialLoadSizeHint(DATABASE_PAGE_SIZE)
            .setPageSize(DATABASE_PAGE_SIZE)
            .setPrefetchDistance(0)
            .build()

        // Get the paged list
        return LivePagedListBuilder(dataSourceFactory, config)
            .setBoundaryCallback(movieBoundaryCallback)
            .build()
    }

    override suspend fun refreshMovies(page: Int) {
        withContext(Dispatchers.IO) {
            moviesDao.deleteAll()
            moviesDao.insertAll(*fetchMovies(page).toTypedArray())
        }
    }
覆盖所有电影(movieBoundaryCallback:
MainViewModel.MovieBoundaryCallback):LiveData{
//从本地缓存获取数据源工厂
val dataSourceFactory=moviesDao.allMovies().map{
MovieMapper.fromDb(
信息技术
)
}
val config:PagedList.config=PagedList.config.Builder()
.setInitialLoadSizeHint(数据库\页面\大小)
.setPageSize(数据库页面大小)
.setPrefetchDistance(0)
.build()
//获取分页列表
返回LivePagedListBuilder(dataSourceFactory,配置)
.setBoundaryCallback(movieBoundaryCallback)
.build()
}
覆盖暂停娱乐电影(第页:Int){
withContext(Dispatchers.IO){
moviesDao.deleteAll()
moviesDao.insertAll(*fetchMovies(第页).toTypedArray())
}
}
边界回调类在ViewModel中定义为Inner类:

    val callback = MovieBoundaryCallback()

    // get movies saved in local db
    val movies = getMoviesUseCase.allMovies(callback)

    ...

    inner class MovieBoundaryCallback : PagedList.BoundaryCallback<Movie>() {
        private var lastRequestedPage = 1
        private var isRequestInProgress = false

        private fun refreshMoviesList() {
            if (isRequestInProgress) return

            isRequestInProgress = true
            if (isInternetAvailable(getApplication())) {
                lastRequestedPage++
                try {
                    viewModelScope.launch {
                        getMoviesUseCase.refreshMovies(lastRequestedPage)
                    }
                    isRequestInProgress = false
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
        }

        override fun onItemAtEndLoaded(itemAtEnd: Movie) {
            refreshMoviesList()
        }
    }
val callback=MovieBoundaryCallback()
//获取保存在本地数据库中的电影
val movies=getmovieusecase.allMovies(回调)
...
内部类MovieBoundaryCallback:PagedList.BoundaryCallback(){
私有变量lastRequestedPage=1
私有变量isRequestInProgress=false
私人娱乐电影列表(){
如果(isRequestInProgress)返回
isRequestInProgress=真
如果(isInternetAvailable(getApplication())){
lastRequestedPage++
试一试{
viewModelScope.launch{
getMoviesUseCase.refreshMovies(lastRequestedPage)
}
isRequestInProgress=错误
}捕获(e:例外){
e、 printStackTrace()
}
}
}
覆盖未加载的项目(项目结束:电影){
刷新电影列表()
}
}
对于RecyclerView的适配器,我扩展了PagedListAdapter。也许问题是因为协同程序?请帮我解决这个问题或给出一个提示。
提前谢谢。

我不太确定,但我想问题是因为deleteAll()insertAll()。Room数据库的一个优点是,它们是被动的,因此在修改数据时可以发布信息,这是一个非常酷的特性


问题是,有时候他们太被动了。房间DB中的deleteAll()insertAll()总是有问题,因为DB在deleteAll()之后以及insertAll()之后发送数据。您必须使WS适应分页数据库,以便仅检索所需的数据,并且在现有实体中可能发生更改的情况下,能够执行“smart insertAll()”…

您解决了这个问题吗?您解决了吗@阿巴尔塔