刷新加载程序而不丢弃以前的数据

时间:2017-09-09 19:56:56

标签: android android-loadermanager

我正在编写一个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呼叫onStartLoadingforceLoad来自LoaderManager?或者我应该不使用LoaderManagerAsyncTaskLoader吗?

0 个答案:

没有答案