我正在编写一个Android应用程序,它使用由AsyncTaskLoader
处理的LoaderManager
来获取一些数据。当应用程序打开时,可以在上游修改数据,但是加载数据非常耗时,我会检查它是否已经被修改过。
我缓存结果和最后修改的字段,我的loadInBackground()
方法在加载实际数据之前首先检查上游数据是否已被修改。检查上游最后修改字段也很耗时,因此必须在AsyncTaskLoader
内完成,而不是在UI线程上完成。
public class DataActivity extends Activity implements LoaderManager.LoaderCallbacks<LoadedData> {
// ...
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
getLoaderManager().initLoader(0, null, this);
}
private void reloadData() { // called from various locations
getLoaderManager().restartLoader(0, null, this);
}
@Override
public Loader<LoadedData> onCreateLoader(int i, Bundle bundle) {
return new DataLoader(this);
}
@Override
public void onLoadFinished(Loader<LoadedData> loader, LoadedData result) {
setActivityLoadingState(false);
updateShownData(result);
}
@Override
public void onLoaderReset(Loader<LoadedData> loader) {}
private static class DataLoader extends AsyncTaskLoader<LoadedData> {
private LoadedData lastData;
private int lastModified = -1;
GameListLoader(DataActivity activity) {
super(activity);
}
@Override
public LoadedData loadInBackground() {
int currentModified = getUpstreamLastModified();
if (currentModified == lastModified)
return lastData;
LoadedData currentData = getUpstreamData();
lastData = currentData;
lastModified = currentModified;
return currentData;
}
@Override
protected void onStartLoading() {
forceLoad();
setActivityLoadingState(true);
}
}
}
现在,我注意到LoaderManager.restartLoader
方法每次都会创建一个新的Loader
,它会完全丢弃我的缓存,并且每次都会加载数据。
有没有办法要求AsyncTaskLoader
刷新(例如,我startLoading
呼叫onStartLoading
,forceLoad
来自LoaderManager
?或者我应该不使用LoaderManager
或AsyncTaskLoader
吗?