因此,我正在使用JetPack工具的Android新的Paging Library部分.
我正在做一个非常基本的演示应用程序,其中显示了从RandomUser API获得的随机用户配置文件列表.
问题是我已经准备好了所有东西,而且实际上还在工作.
在列表的片段中,我正在监听数据库更改:
...mainviewmodel.userProfiles.observe(this, Observer { flowableList -> usersAdapter.submitList(flowableList) })...
(我尝试将两者同时使用,将Flowables和Observables与RxPagedListBuilder一起使用,现在我将liveData与livePagedListBuilder一起使用.如果可能,我想使用RxPagedListBuilder.)
在我的viewmodel中,我设置了livePagedListBuilder
...private val config = PagedList.Config.Builder() .setEnablePlaceholders(false) .setPrefetchdistance(UserProfileDataSource.PAGE_SIZE / 2) //Is very important that the page size is the same everywhere! .setPageSize(UserProfileDataSource.PAGE_SIZE) .build()val userProfiles: liveData<PagedList<UserProfile>> = livePagedListBuilder( UserProfileDataSourceFactory(userProfileDao), config) .setBoundaryCallback(UserProfileBoundaryCallback(randomUserRepository, userProfileDao)) .build()...
我已将DataSource设置为从数据库中获取数据(如果有的话):
class UserProfileDataSource(val userDao: UserDao): PageKeyedDataSource<Int, UserProfile>() { companion object { const val PAGE_SIZE = 10 } overrIDe fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, UserProfile>) { callback.onResult(userDao.getUserProfileWithlimitAndOffset(PAGE_SIZE, 0), 0, PAGE_SIZE) } overrIDe fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, UserProfile>) { callback.onResult(userDao.getUserProfileWithlimitAndOffset(PAGE_SIZE, params.key), params.key + PAGE_SIZE) } overrIDe fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, UserProfile>) { //This one is not used }}
如果数据库为空,我将BoundaryCallback设置为从网络获取数据:
class UserProfileBoundaryCallback(val userRepository: RandomUserRepository, val userDao: UserDao) : PagedList.BoundaryCallback<UserProfile>() { /** * Database returned 0 items. We should query the backend for more items. */ overrIDe fun onZeroItemsLoaded() { userRepository.getUserProfiles(0, UserProfileDataSource.PAGE_SIZE) .subscribeOn(Schedulers.io()) //We shouldn't write in the db over the UI thread! .subscribe(object: DataSourceSubscriber<List<UserProfile>>() { overrIDe fun onResultNext(userProfiles: List<UserProfile>) { userDao.storeUserProfiles(userProfiles) } }) } /** * User reached to the end of the List. */ overrIDe fun onItemAtEndLoaded(itemAtEnd: UserProfile) { userRepository.getUserProfiles(itemAtEnd.indexPageNumber + 1, UserProfileDataSource.PAGE_SIZE) .subscribeOn(Schedulers.io()) //We shouldn't write in the db over the UI thread! .subscribe(object: DataSourceSubscriber<List<UserProfile>>() { overrIDe fun onResultNext(userProfiles: List<UserProfile>) { userDao.storeUserProfiles(userProfiles) } }) }}
事实是,当UserProfileDataSource从数据库返回一些结果时,仅当数据来自数据库时,UI中的Flowable,Observable或liveData才会被触发.如果UserProfileDataSource不返回任何结果,则将调用BoundaryCallback,对API的请求已成功完成,数据已存储在数据库中,但Flowable永远不会触发.如果我关闭该应用程序并再次打开它,它将从数据库中获取我们刚刚获得的数据,然后将其正确显示.
我已经尝试了在搜索的所有文章,教程和github项目中看到的所有可能的解决方案.
如我所说,我尝试将RxPagedListBuilder更改为livePagedListBuilder.
使用RxPagedListBuilder时,我尝试使用Flowables和Observables.
我尝试使用不同的计划程序为PagedList.Config.Builder设置不同的配置.
我在这里真的没有选择,我整天都在为此苦苦挣扎,任何技巧都会不胜感激.
如果您需要有关代码的更多信息,请给我留言,我将更新帖子.
更新:
我已经将完整的源代码提交给了我的Github repo
解决方法:
好的,我发现了错误:
我刚刚删除了UserProfileDataSourceFactory和UserProfileDataSource类.取而代之的是,我将此方法添加到了DAO中:
@query("SELECT * FROM user_profile")fun getUserProfiles(): DataSource.Factory<Int, UserProfile>
我正在像这样构建我的RxPagedListBuilder:
RxPagedListBuilder(userDao.getUserProfiles(), UserProfileDataSource.PAGE_SIZE) .setBoundaryCallback(UserProfileBoundaryCallback(randomUserAPI, userDao)) .buildobservable()
就是这样.我不确定为什么它不能与DataSource和DataSourceFactory一起使用,如果有人可以解释这种奇怪的行为,我会将其标记为可接受,因为我的解决方案更像是幸运的镜头.
但是现在发生的一件事是,当我将数据加载到适配器中时,适配器会滚动回到顶部位置.
总结以上是内存溢出为你收集整理的android-分页库:将数据保存在数据库中不会触发用户界面更改全部内容,希望文章能够帮你解决android-分页库:将数据保存在数据库中不会触发用户界面更改所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)