android - 如何将 AsyncTaskLoader 绑定(bind)到 Fragment 的生命周期?

标签 android android-fragments loader android-loadermanager asynctaskloader

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

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

有什么办法吗?

到目前为止,我将加载器的初始化包装在一个 fragment 中,并且每个 fragment 都有一个内部 AsyncTaskLoader,我也对其进行了自定义。然后,当 fragment 初始化时,在 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()

关于android - 如何将 AsyncTaskLoader 绑定(bind)到 Fragment 的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33072766/

相关文章:

android - 如何检测小部件是否在屏幕上/屏幕外?

android - 将图像添加到 android 中关于触摸位置的触摸布局

android - 无法刷新 ListFragment 中的数据

android - 获取父 fragment API 16

java - 未考虑 Tomcat 共享加载程序

Linux 用户空间 ELF 加载器

android - 如何从特定索引开始ArrayList?

android - 未检测到我的 MotionEvent.ACTION_DOWN

java - 使用 Fast-Video-View 自动启动视频

ios - 从加载程序复制位图数据