num*_*um1 16 android android-fragments android-loadermanager android-support-library
在LoaderManager中识别Loaders时,使用唯一ID.我问的是这些ID有多独特.
每个活动和片段都有自己的LoaderManager吗?片段是否使用他们附加的Activity的LoaderManager?应用程序是否只拥有一个LoaderManager?
如果您能告诉我如何更改您正在使用的LoaderManager,可以获得奖励积分.如果我希望我的Activity中的每个片段都使用相同的LoaderManager(其中一些是拉相同的数据并且共享Loaders会很好),那可能吗?
我目前正在将我的应用程序移植到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上的寄存器调用.
未完待续…
| 归档时间: |
|
| 查看次数: |
2399 次 |
| 最近记录: |