gpt4 book ai didi

android - 多次调用分页库中的回调

转载 作者:行者123 更新时间:2023-12-03 17:28:37 24 4
gpt4 key购买 nike

在可能的项目中,我正在使用 Android Architecture Components 中的 Paging 库。从用作缓存的 Room db 读取数据,当到达列表末尾时,我使用边界回调从网络 api 获取新数据。不幸的是,当从 api 调用新的更新时,它被调用了 4 次或更多次,即使方法中有 bool 标志,所以新数据不正确。

从数据库我返回 Datasource.Factory:

    @Query("SELECT * FROM movieentity ORDER BY popularity DESC")
fun allMovies(): DataSource.Factory<Int, MovieEntity>

存储库中的方法,基本上我想清除缓存并从 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())
}
}

Boundary 回调类在 ViewModel 中定义为内部类:
    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()
}
}

对于 RecyclerView 的适配器,我扩展了 PagedListAdapter。也许问题是因为协程?请帮我解决这个问题或给出提示。
提前致谢。

最佳答案

我不太确定,但我想问题是因为 deleteAll() insertAll()。 Room 数据库的一个优点是它们是响应式(Reactive)的,因此它们可以在数据被修改时发布信息,这是一个非常酷的功能。
问题是,有时他们太被动了。 deleteAll() insertAll() 始终是 Room DB 的问题,因为 DB 在 deleteAll() 和 insertAll() 之后发送数据。您将不得不使您的 WS 适应分页数据库,以便能够仅检索所需的数据,并且如果现有实体可能发生变化,则能够执行“智能 insertAll()”...

关于android - 多次调用分页库中的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58259146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com