LoaderManager的范围是什么?

num*_*um1 16 android android-fragments android-loadermanager android-support-library

在LoaderManager中识别Loaders时,使用唯一ID.我问的是这些ID有多独特.

每个活动和片段都有自己的LoaderManager吗?片段是否使用他们附加的Activity的LoaderManager?应用程序是否只拥有一个LoaderManager?

如果您能告诉我如何更改您正在使用的LoaderManager,可以获得奖励积分.如果我希望我的Activity中的每个片段都使用相同的LoaderManager(其中一些是拉相同的数据并且共享Loaders会很好),那可能吗?

Ren*_*aud 8

我目前正在将我的应用程序移植到android兼容包(主要用于CursorLoader和Fragments).我目前正在尝试在两个片段之间共享一个CursorLoader,以便为我的ContentProvider提供查询.欢迎来到我的世界!;)

一个简单的用例:

- DummyActivity扩展了FragmentActivity/Log.d(Constants.LOGTAG,"DummyActivity.onCreate"+ getSupportLoaderManager().toString());

- DataFragment扩展Fragment实现LoaderManager.LoaderCallbacks/Log.d(Constants.LOGTAG,"DataFragment.onCreate"+ getLoaderManager().toString());

- ReportFragment extends Fragment实现了LoaderManager.LoaderCallbacks/Log.d(Constants.LOGTAG,"ReportFragment.onCreate"+ getLoaderManager().toString());

DummyActivity实例化DataFragment,后者实例化ReportFragment.logcat输出显示每个LoaderManager的不同地址.作为第一个结论,每个片段似乎都有一个合适的LoaderManager ......

如果我能回答你的(我们的)问题,我会继续更新.如果您取得了任何进展,请分享您的宝贵知识.

更新:

我的假设是加载器ID只与特定片段的LoaderManager的本地范围相关联,以使多个本地加载器与该片段相关联(因此您可以根据id int arg和on来返回onCreateLoader中的不同加载器. initLoader调用).

到目前为止,我设法"重用"一个Loader(......或不):

- 首先,我getSupportLoaderManager().enableDebugLogging(true);在DummyActivity onCreate方法中启用了LoaderManager调试.

- 然后我getActivity().getSupportLoaderManager().initLoader(78, null, this);onCreateDataFragment和ReportFragment 的方法调用.

- DataFragment onCreateLoader通过mCursorLoader私有成员上的setter 公开由方法创建的CursorLoader .

- ReportFragment onCreateLoader返回DataFragment CursorLoader(在检索Fragment后findFragmentByTag).

过滤(并略微混淆)的logcat输出:

      DummyApp  D  DummyActivity.onCreate
      DummyApp  D  DataFragment.newInstance
      DummyApp  D  ReportFragment.newInstance
      DummyApp  D  DataFragment.onCreate
 LoaderManager  V  initLoader in LoaderManager{405a19d0 in SpecificAction{4059ee98}}: args=null
      DummyApp  D  DataFragment.onCreateLoader
 LoaderManager  V    Created new loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
      DummyApp  D  DataFragment.onCreate
      DummyApp  D  DataFragment.onActivityCreated
      DummyApp  D  ReportFragment.onCreate
 LoaderManager  V  initLoader in LoaderManager{405a19d0 in DummyActivity{4059ee98}}: args=null
 LoaderManager  V    Re-using existing loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
      DummyApp  D  SpecificActionReportFragment.onCreate
      DummyApp  D  SpecificActionReportFragment.onActivityCreated
 LoaderManager  V  Starting in LoaderManager{405a19d0 in DummyActivity{4059ee98}}
 LoaderManager  V    Starting: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
 DummyProvider  D  query called
 DummyProvider  D  […]       
 DummyProvider  D  [end of query]
 LoaderManager  V  onLoadComplete: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
 LoaderManager  V    onLoadFinished in CursorLoader{405a22e0 id=78}: CursorWrapperInner{405afb20}
      DummyApp  D  ReportFragment.onLoadFinished
      DummyApp  D  ReportFragment.displayActionReport
      DummyApp  D  DummyActivity.setReportViewsVisibility
      DummyApp  D  ReportFragment.setSaveReportImageViewVisibility
Run Code Online (Sandbox Code Playgroud)

这两个片段是从DummyActivity onCreate方法添加的(与描述的用例不同,但是对我们正在处理的问题没有任何改变).不幸的是,加载器被重新分配给调用它的最新片段(这里是ReportFragment)......并且从不调用DataFragment.onLoadFinished.因此,ReportFragment看起来不错,但DataFragment不是最新的,因为从onLoadFinished此类调用更新.

我假设有一个潜在的取消注册调用,然后是CursorLoader上的寄存器调用.

未完待续…