我必須從數據庫加載緩存版本的數據,同時我想向服務器請求新鮮數據,並且我希望在每頁基礎上執行此操作。 因此,例如對於第一頁,我想要顯示來自數據庫的第一頁數據的緩存版本,而僅請求第一頁的新數據。
我想用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);
}