Android Honeycomb 中的加载程序
Posted
技术标签:
【中文标题】Android Honeycomb 中的加载程序【英文标题】:Loaders in Android Honeycomb 【发布时间】:2011-06-22 16:45:51 【问题描述】:我正在尝试弄清楚如何在 android 3.0 中使用 Loaders
,但似乎无法使其正常工作。文档只描述了使用CursorLoader
,但我使用的是AsyncTaskLoader
。
从文档看来,您应该只需要实现AsyncTaskLoader.loadInBackground()
,但它永远不会在getLoaderManager().initLoader()
之后被调用,然后在回调中创建加载程序。
我可以看到调试消息说Created new loader LoaderInfo4040a828 #0 : ArticleDataLoader4036b350
,所以它似乎已成功创建。
是否有可能加载器当前在 SDK 中已损坏,或者在创建加载器后需要调用某些方法? (他们在CursorLoader
示例中没有这样做)。
编辑:似乎在从initLoader()
返回的加载器上调用forceLoad()
至少会开始加载,但这意味着您无法正确处理旋转:(
【问题讨论】:
如果您找到了答案,请告诉我。我什么都没找到。 还有code.google.com/p/android/issues/detail?id=14944 提到了与“编辑”评论相同的解决方法。 是的,这是我的错误报告 :) 你检查过developer.android.com/reference/android/app/LoaderManager.html吗? 【参考方案1】:Dianne Hackborn 在 bug tracker 上回复了我们,并推荐我们参考静态库实现。 CursorLoader 正在执行 forceLoad() 这就是它工作的原因。
请参阅我附加的课程,以了解在错误跟踪器的大多数简单情况下为您处理此问题的课程:http://code.google.com/p/android/issues/detail?id=14944
【讨论】:
他们确实需要记录 CPL >. 这真的很糟糕。因此此处显示的示例:developer.android.com/reference/android/content/… 如果您使用支持库,除非您覆盖onStartLoading
所以现在我有了自己的 ASyncTaskLoader 参考源,使用支持库:blog.blundell-apps.com/…【参考方案2】:
您需要重写 onStartLoading() 方法。看developer website上的例子。
/**
* Handles a request to start the Loader.
*/
@Override protected void onStartLoading()
if (mApps != null)
// If we currently have a result available, deliver it
// immediately.
deliverResult(mApps);
// Start watching for changes in the app data.
if (mPackageObserver == null)
mPackageObserver = new PackageIntentReceiver(this);
// Has something interesting in the configuration changed since we
// last built the app list?
boolean configChange = mLastConfig.applyNewConfig(getContext().getResources());
if (takeContentChanged() || mApps == null || configChange)
// If the data has changed since the last time it was loaded
// or is not currently available, start a load.
forceLoad();
【讨论】:
【参考方案3】:亚历克斯; 您是否尝试验证 onLoadInBackground () 是否被调用?
onLoadInBackground():在工作线程上调用以执行实际加载。实现不应该直接传递结果,而是应该从这个方法返回结果,最终会在 UI 线程上调用 DeliverResult(D)。如果实现需要在 UI 线程上处理结果,他们可能会覆盖 DeliverResult(D) 并在那里执行。
【讨论】:
不,除非你执行 forceLoad(),否则它不会被调用。以上是关于Android Honeycomb 中的加载程序的主要内容,如果未能解决你的问题,请参考以下文章
Android Honeycomb:如何更改 FrameLayout 中的片段,而不重新创建它们?
Android Honeycomb:如何更改 FrameLayout 中的片段,而不重新创建它们?