gpt4 book ai didi

android - 分页库 - 在从网络请求时从缓存中填充

转载 作者:行者123 更新时间:2023-11-29 02:36:26 25 4
gpt4 key购买 nike

我必须从数据库加载缓存版本的数据,同时我想向服务器发出新数据请求,并且我想在每页的基础上执行此操作。因此,例如,对于第一页,我想显示来自数据库的第一页数据的缓存版本,同时只为第一页请求新数据。
我想使用 Paging Library 来实现这一点.
我尝试创建自定义数据源,它帮助我拦截页面加载请求,然后我用所需的页码和限制进行网络调用,同时我从 db 返回了一个缓存版本,问题是在从网络获取新数据后我更新了数据库,但未反射(reflect)这些更新。
(我相信正在观察整个表是否使用 Invalidation Tracker 进行任何修改,并且只要表无效,数据源就会失效,我也在我的数据源中添加了该跟踪器,但它仍然无法正常工作;我能够确定 Invalidation通过临时创建的跟踪器事物:在 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);
}

最佳答案

所以我明白了为什么它不起作用,我这边犯了一个错误,我将错误的参数传递给了 JobsRepository 中 JobDao 的 getJobs 方法。

JobDao的getJobs方法如下:

@Query("SELECT * FROM jobs ORDER BY jobID ASC LIMIT :limit OFFSET :offset")
List<JobEntity> getJobs(int limit, int offset);

JobsRepository 中的 getJobs() 调用如下:

return mJobDao.getJobs(startPosition, count);

所以第一个参数是限制,下一个参数是偏移量,但我以相反的方式传递。
现在它就像一个魅力!

此外,我对 JobsRepository 中的 getJobs() 进行了更改:首先从数据库获取数据,如果可用则返回并在需要时向网络发出异步请求。如果数据库中没有可用数据,则对网络进行同步调用,从网络获取数据,解析数据并将其保存到数据库中,现在从数据库中访问最新数据并将其返回。所以函数是这样的:

//you can even refactor this code so that all the network related stuff is in one class and just call that method
public List<JobListItemEntity> getJobs(String query, int startPosition, int count) {
Observable<JobList> jobListObservable = mApiService.getOpenJobList(
mRequestJobList.setPageNo(startPosition / count + 1)
.setMaxResults(count)
.setSearchKeyword(query));

List<JobListItemEntity> jobs = mJobDao.getJobsLimitOffset(count, startPosition);

//no data in db, make a synchronous call to network to get the data
if (jobs.size() == 0) {
JobList jobList = jobListObservable.blockingSingle();
updateJobList(jobList, startPosition, false);
} else if (shouldFetchJobList(jobs)) {
//data available in db, so show a cached version and make async network call to update data as this data is no longer fresh
jobListObservable.subscribe(new Observer<JobList>() {
@Override
public void onSubscribe(Disposable d) {

}

@Override
public void onNext(JobList jobList) {
updateJobList(jobList, startPosition, true);
}

@Override
public void onError(Throwable e) {
Timber.e(e);
}

@Override
public void onComplete() {

}
});
}
return mJobDao.getJobsLimitOffset(count, startPosition);
}

updateJobList() 代码:

    private void updateJobList(JobList jobList, int startPosition, boolean performInvalidation) {
JobListItemEntity[] jobs = jobList.getJobsData();

Date currentDate = Calendar.getInstance().getTime();

//tracks when this item was inserted in db, used in calculating whether data is stale
for (int i = 0; i < jobs.length; i++) {
jobs[i].insertedAt = currentDate;
}

mJobDao.insert(jobs);

if (performInvalidation) {
mJobListDataSource.invalidate();
}
}

(我还将 JobDao 中的 getJobs() 重命名为 getJobsLimitOffset() ,因为它使其更具可读性,这也是分页库生成方法的方式)

关于android - 分页库 - 在从网络请求时从缓存中填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46745915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com