我必须从数据库加载缓存版本的数据,同时我想向服务器请求新鲜数据,并且我希望在每页基础上执行此操作。 因此,例如对于第一页,我想要显示来自数据库的第一页数据的缓存版本,而仅请求第一页的新数据。
我想用Paging Library来实现这个。
我试图创建自定义数据源,它帮助我拦截页面加载请求,然后我用网页调用所需的页码和限制,同时我从数据库返回一个缓存版本,问题是在从网络获取新数据后我更新数据库,但这些更新没有反映出来。 (我相信使用Invalidation Tracker的任何修改都会观察整个表格,并且无论何时表格无效,数据源都会失效,但我也在数据源中添加了该跟踪器,但仍然无法使用;我能够使指出,失效跟踪的事情暂时创建:在JobDao LivePagedListProvider getJobs(),并检查生成的实现)分页库 - 在从网络请求时从缓存填充
代码:
public class JobListDataSource<T> extends TiledDataSource<T> {
private final JobsRepository mJobsRepository;
private final InvalidationTracker.Observer mObserver;
String query = "";
public JobListDataSource(JobsRepository jobsRepository) {
mJobsRepository = jobsRepository;
mObserver = new InvalidationTracker.Observer(JobEntity.TABLE_NAME) {
@Override
public void onInvalidated(@NonNull Set<String> tables) {
invalidate();
}
};
jobsRepository.addInvalidationTracker(mObserver);
}
@Override
public int countItems() {
return DataSource.COUNT_UNDEFINED;
}
@Override
public List<T> loadRange(int startPosition, int count) {
return (List<T>) mJobsRepository.getJobs(query, startPosition, count);
}
public void setQuery(String query) {
this.query = query;
}
}
职位库功能:
public List<JobEntity> getJobs(String query, int startPosition, int count) {
if (!isJobListInit) {
JobList jobList = mApiService.getOpenJobList(
mRequestJobList.setPageNo(startPosition/count + 1)
.setMaxResults(count)
.setSearchKeyword(query)
).blockingSingle();
mJobDao.insert(jobList.getJobsData());
}
return mJobDao.getJobs(startPosition, count);
}
public void addInvalidationTracker(InvalidationTracker.Observer observer) {
mAppDatabase.getInvalidationTracker().addObserver(observer);
}