如何将AsyncTaskLoader绑定到Fragment的生命周期?

时间:2015-10-12 03:19:39

标签: android android-fragments loader android-loadermanager asynctaskloader

我正在使用支持库并使用AsyncTaskLoader。为什么AsycTaskLoader的构造函数不接受Fragment作为参数?

我只希望AsyncTaskLoader在我的片段中调用或初始化时开始加载数据。但截至目前,Activity随时转到onResume,它会重新启动我在不同片段上初始化的所有加载器。我相信这主要是因为我在我的AsyncTaskLoader实例的构造函数中传递fragment.getActivity()

有什么办法吗?

到目前为止,我在一个片段中包装加载器的初始化,每个都有一个内部的AsyncTaskLoader,我也自定义了。然后在片段初始化时,在onCreateView方法中,我然后调用方法:

initLoader();

initLoader()方法

public Loader<Object> initLoader() {
    return getLoaderManager().initLoader(LOADER_ID.DUMMIES, null, new LoaderCallbacks<Object>() {
        @Override
        public Loader<Object> onCreateLoader(int id, Bundle args) {
            Loader<Object> loader = new CustomLoader<Object>(getActivity()) {
                @Override
                public Object loadInBackground() {
                    return DummyGenerator.generateDummyEntriesToDb();;
                }
            };
            return loader;
        }

        @Override
        public void onLoadFinished(Loader<Object> loader, Object data) {
            setToDb(data);
        }

        @Override
        public void onLoaderReset(Loader<Object> loader) {

        }
    });
}

CustomLoader.java - 通用实施我适合我的需要。 releaseResources方法未填写,但我将其留在那里以备将来使用。

public class CustomLoader<T> extends AsyncTaskLoader<T> {

    T mData;

    public CustomLoader(Context context) {
        super(context);
    }

    @Override
    public T loadInBackground() {
        return null;
    }

    @Override
    public void deliverResult(T data) {
        if (isReset()) {
            releaseResources(data);
            return;
        }

        T oldData = mData;
        mData = data;

        if (isStarted()) {
            super.deliverResult(data);
        }

        if (oldData != null && oldData != data) {
            releaseResources(oldData);
        }
    }

    @Override
    protected void onStartLoading() {
        if (mData != null) {
            deliverResult(mData);
        }

        if (takeContentChanged() || mData == null) {
            forceLoad();
        }
    }

    @Override
    protected void onStopLoading() {
        cancelLoad();
    }

    @Override
    protected void onReset() {
        onStopLoading();

        if (mData != null) {
            releaseResources(mData);
            mData = null;
        }

    }

    @Override
    public void onCanceled(T data) {
        super.onCanceled(data);
        releaseResources(data);
    }

    public void releaseResources(T data) {

    }
}

generateDummyEntriesToDb方法正常工作,只创建我正在使用的对象列表,以及setToDb()方法。问题是当活动转到onResume时再次调用loadnBackground()方法,因此我不得不认为所有其他加载器的行为方式相同。

1 个答案:

答案 0 :(得分:1)

提供的Context应该是Activity附加的Fragment。确保通过LoaderManager初始化加载程序,因为它与相应的对象生命周期相关联。因此,当从Fragment内进行初始化时,您应该使用Fragment.getLoaderManager()。然后适当地致电LoaderManager.initLoader()