Ich muss zwischengespeicherte Version der Daten aus der Datenbank laden und gleichzeitig möchte ich eine Anfrage an den Server für frische Daten, und ich möchte dies auf einer Seite zu tun. So, zum Beispiel für die erste Seite möchte ich eine im Cache gespeicherte Version der ersten Seite Daten aus der Datenbank zeigen, während neue Daten nur für die erste Seite anfordern.
Ich möchte dies unter Verwendung Paging Library erreichen. Ich versuchte, benutzerdefinierte Datenquelle zu erstellen, die mir half, Seitenladeanforderung abzufangen, die ich dann einen Netzwerkaufruf mit erforderlicher Seitennummer und Limit machte, und inzwischen gab ich eine zwischengespeicherte Version von db zurück, das Problem ist nach dem Erhalten neuer Daten aus dem Netzwerk Ich aktualisiere die Datenbank, aber diese Aktualisierungen werden nicht wiedergegeben. (Ich glaube, die ganze Tabelle wird für alle Änderungen mit Invalidation Tracker beobachtet und Datenquelle wird ungültig, wenn Tabellen ungültig sind, habe ich diesen Tracker in meiner Datenquelle auch hinzugefügt, aber es funktioniert immer noch nicht, ich konnte machen darauf hin, dass Sache Invalidation Tracker vorübergehend zu erstellen: LivePagedListProvider getJobs() in Jobdao und Überprüfung erzeugt Implementierung)Paging-Bibliothek - füllen Sie aus dem Cache während der Anfrage aus dem Netzwerk
Code:
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;
}
}
Jobs Repository Funktionen:
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);
}