我注意到了使用Android Loaders和Fragment的奇怪情况。当我在方向改变后调用LoaderManager.initLoader()时,onLoadFinished没有被调用(尽管文档建议我应该为此做好准备),但在此之后它被调用了两次。这里链接到描述相同情况https://groups.google.com/forum/?fromgroups#!topic/android-developers/aA2vHYxSskU的谷歌群组中的帖子。我编写了示例应用程序,其中我只在Fragment.onActivityCreated()中初始化simple Loader来检查是否发生了这种情况,它确实发生了。有人注意到了吗?
发布于 2013-01-25 22:40:35
您可以将initLoader()方法放入片段的onResume()回调中,这样就不会再调用Loader的onLoadFinished()两次。
@Override
public void onResume()
{
super.onResume();
getLoaderManager().initLoader(0, null, this);
}
发布于 2014-03-05 05:17:42
这个问题在我看来是显而易见的,因为CursorLoader返回了一个已经关闭的光标:
android.database.StaleDataException: Attempted to access a cursor after it has been closed.
我猜这是个bug或者疏忽。虽然将initLoader()转移到onResume中可能会起作用,但我能够做的是在完成加载程序后将其删除:
要启动加载器(在我的onCreate中):
getLoaderManager().initLoader(MUSIC_LOADER_ID, null, this);
然后在我完成它之后(基本上是在onLoadFinished的末尾)
getLoaderManager().destroyLoader(MUSIC_LOADER_ID);
这似乎是预期的行为,没有额外的调用。
发布于 2016-03-06 15:10:22
我解决了onLoadFinished被这样调用两次的问题。在你的Fragment.onActivityCreated()中,像这样初始化你的Loader
if (getLoaderManager().getLoader(LOADER_ID) == null) {
getLoaderManager().initLoader(LOADER_ID, bundle, loaderCallbacks);
} else {
getLoaderManager().restartLoader(LOADER_ID, bundle, loaderCallbacks);
}
在这里,loaderCallbacks实现了常见的加载器回调
private LoaderManager.LoaderCallbacks<T> loaderCallbacks
= new LoaderManager.LoaderCallbacks<T>() {
@Override
public Loader<T> onCreateLoader(int id, Bundle args) {
...
...
}
@Override
public void onLoadFinished(Loader<T> loader, T data) {
...
...
}
@Override
public void onLoaderReset(Loader<T> loader) {
...
...
}
};
https://stackoverflow.com/questions/11293441
复制相似问题