キャッシュされたバージョンのデータをデータベースから読み込む必要があります。同時に、新しいデータをサーバーに要求したいので、これをページごとに行います。 たとえば、最初のページの場合、データベースから最初のページデータのキャッシュバージョンを表示し、最初のページのみ新しいデータを要求したいとします。
Paging Libraryを使用してこれを達成したいと思います。
私はページのロード要求を傍受するのに役立つカスタムデータソースを作成しようとしましたが、その後、必要なページ番号と制限でネットワークコールを作成していましたが、キャッシュされたバージョンをデータベースから返しました。私はデータベースを更新しますが、それらの更新は反映されません。
(テーブル全体が無効化トラッカーを使用して変更されたために観察され、テーブルが無効になったときにデータソースが無効になると思うので、データソースにそのトラッカーを追加しても動作しません。一時的に作成することによって、その無効トラッカー事アウト: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);
}