管理加载器ID唯一性

时间:2013-05-22 20:27:52

标签: android android-fragments android-loadermanager android-cursorloader

我发现我的CursorLoader回调正在混淆游标。

问题似乎是那个

Fragment.getLoaderManager()与getActivity()是相同的加载器ID范围.getSupportLoaderManager()

来自AOSP

public LoaderManager getLoaderManager() {
    if (mLoaderManager != null) {
        return mLoaderManager;
    }
    if (mActivity == null) {
        throw new IllegalStateException("Fragment " + this + " not attached to Activity");
    }
    mCheckedForLoaderManager = true;
    mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true);
    return mLoaderManager;
}

所以我所经历的是我的片段中的ID冲突,所以错误的游标希望跨越片段。

我需要一个策略来创建静态和/或动态(在动态数量的加载器的情况下)id,它们知道所有其他碎片ID ...?

1 个答案:

答案 0 :(得分:4)

只要您使用fragment.getLoader(),就可以在装载程序的不同片段中使用相同的ID。更深入地遵循ASOP代码,您将看到

mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true);

调用一个包私有方法,该方法从加载器的ArrayMap获取一个加载器。 mIndex(片段的唯一字符串)是该ArrayMap的索引,对片段是唯一的。查看getLoader()的Activity实现,您将看到它执行此操作:

mLoaderManager = mActivity.getLoaderManager("(root)", mLoadersStarted, true);

显然,Activity拥有自己的加载器以及每个片段。问题出在代码中的其他地方。