从LoaderManager获取“已经启动时调用doStart”。为什么?

时间:2013-01-28 10:02:19

标签: android android-loadermanager

我的代码有一个Activity,它有一个FragmentPagerAdapter,可以根据需要创建'n'个片段。 Activity有一个加载器,每个片段都有自己的加载器。所有装载机都有唯一的ID。 (Activity的加载器实际上决定了适配器中的Pages数量)

我一直在这里和那里得到这个警告,不能指责导致它的原因。 它似乎并不重要,也看着LoaderManger的代码抛出这个警告,但仍然 - 警告通常是错误的迹象..

最初使用FragmentStatePagerAdapter然后转移到FragmentPagerAdapter,认为这可能是某种问题 - 但显然不是。

发布代码会使这一点变得复杂并且添加很少。

有什么想法吗?

2 个答案:

答案 0 :(得分:15)

在你的片段中

在initActivityCreated方法中移动你的initLoader方法。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    LoaderManager lm = getLoaderManager();
    lm.initLoader(LOADER_ID, null, this);
}

答案 1 :(得分:4)

我刚刚与支持库完成了几个小时的调试会议。

TL; DR:请勿在{{1​​}}中致电getLoaderManager,使用onActivityCreated
(这意味着您无法在Fragment.onCreate之前)initLoader

onActivityCreated会懒散地从活动中获取Fragment.getLoaderManager()个实例。然而,为了使其成为有效的片段,必须激活片段(LoaderManager),这意味着这里有两件事情:

  • 已添加片段 (FragmentManager.makeActive
  • Fragment有一个内部标识符(FragmentManager.addFragment
    mWho来电makeActive

后者非常重要,因为当您致电Fragment.setIndex时,Fragment.getLoaderManager()会要求FragmentActivity.getLoaderManager(who, ...)提供真正的经理。从Fragment.onCreate()拨打makeActive来电时,LoaderManagerImpl来电还没有发生,所以你会找回mWho == null LoaderManager这是不好的,因为该框架将会将LoaderManager实例重新分配给具有相似生命周期的每个片段。

由于这个重新分配,mWho已经由一个片段启动,但是另一个片段也会尝试启动它,因为活动不知道哪个片段在询问,它们都没有他们的身份({{1}})。