【问题标题】:managing loader id uniqueness管理 loader id 的唯一性
【发布时间】:2013-05-22 20:27:51
【问题描述】:

我发现我的 CursorLoader 回调混淆了光标。

问题似乎是这样的

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

来自 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...?

【问题讨论】:

  • 你能举一个更具体的例子来说明你遇到的问题吗?确实,如果您查看源代码,Fragments 共享相同的底层加载器管理器实例,但您仍然应该能够区分每个片段的不同加载器集(即使它们具有相同的 id)。
  • 例如说我有一个片段加载一个特定的数据表,可能有不同的过滤器。我在同一个活动(多窗格)中有两个相同片段的实例。如果我将 loader id 设置为 0,那么两者都为零,并且光标回调会变得混乱。
  • 只是仔细检查...您是否在您的Fragments onCreate() 方法中调用了initLoader()?确保你不要那样做。而是在 onActivityCreated() 中初始化片段的加载器。
  • 是的,我正在这样做,问题在于提供唯一的加载程序 ID。我唯一能想到的可能是让片段向活动询问未使用的加载程序 ID 并存储它。但我认为加载程序 ID 需要在活动破坏时保持稳定,例如。回转。也许需要比在整个应用程序中幸存的某种单例更高的东西,考虑到范围只是活动,这是矫枉过正的,但它是唯一能够在活动破坏后幸存下来的东西,保持稳定的 ID,但也提供动态 ID一些布局需要...
  • 您应该能够使用包含相同 ID 的加载器拥有多个片段,并且不会出现任何问题。我认为您的代码有问题导致回调混淆...

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


【解决方案1】:

只要您使用的是fragment.getLoader(),您的加载程序的不同片段中就可以有相同的id。按照 ASOP 代码再深入一点,你会看到

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

调用一个包私有方法,该方法从加载器的 ArrayMap 中获取加载器。 mIndex(片段的唯一字符串)是该 ArrayMap 的索引,并且对于片段是唯一的。查看 getLoader() 的 Activity 实现,您会发现它是这样做的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2018-12-22
    • 2015-10-03
    • 2013-09-24
    • 2018-07-31
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多