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

How can I tie an AsyncTaskLoader to a Fragment's lifecycle?

我正在使用支持库和 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() 方法。问题是当 activity 转到 onResume 时, loadnBackground() 方法再次被调用,因此我不得不认为所有其他加载器的行为方式相同。

提供的 Context 应该是附加到 FragmentActivity。请确保您正在通过 LoaderManager 初始化加载程序,因为它与适当的对象生命周期相关联。所以当从 Fragment 中初始化时,你应该使用 Fragment.getLoaderManager()。然后适当调用LoaderManager.initLoader()