首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓: LoaderCallbacks.OnLoadFinished调用了两次

安卓: LoaderCallbacks.OnLoadFinished调用了两次
EN

Stack Overflow用户
提问于 2012-07-02 20:10:27
回答 8查看 19.8K关注 0票数 56

我注意到了使用Android Loaders和Fragment的奇怪情况。当我在方向改变后调用LoaderManager.initLoader()时,onLoadFinished没有被调用(尽管文档建议我应该为此做好准备),但在此之后它被调用了两次。这里链接到描述相同情况https://groups.google.com/forum/?fromgroups#!topic/android-developers/aA2vHYxSskU的谷歌群组中的帖子。我编写了示例应用程序,其中我只在Fragment.onActivityCreated()中初始化simple Loader来检查是否发生了这种情况,它确实发生了。有人注意到了吗?

EN

回答 8

Stack Overflow用户

发布于 2013-01-25 22:40:35

您可以将initLoader()方法放入片段的onResume()回调中,这样就不会再调用Loader的onLoadFinished()两次。

代码语言:javascript
复制
    @Override
public void onResume()
{
    super.onResume();
    getLoaderManager().initLoader(0, null, this);
}
票数 39
EN

Stack Overflow用户

发布于 2014-03-05 05:17:42

这个问题在我看来是显而易见的,因为CursorLoader返回了一个已经关闭的光标:

代码语言:javascript
复制
android.database.StaleDataException: Attempted to access a cursor after it has been closed.

我猜这是个bug或者疏忽。虽然将initLoader()转移到onResume中可能会起作用,但我能够做的是在完成加载程序后将其删除:

要启动加载器(在我的onCreate中):

代码语言:javascript
复制
  getLoaderManager().initLoader(MUSIC_LOADER_ID, null, this);

然后在我完成它之后(基本上是在onLoadFinished的末尾)

代码语言:javascript
复制
  getLoaderManager().destroyLoader(MUSIC_LOADER_ID);

这似乎是预期的行为,没有额外的调用。

票数 32
EN

Stack Overflow用户

发布于 2016-03-06 15:10:22

我解决了onLoadFinished被这样调用两次的问题。在你的Fragment.onActivityCreated()中,像这样初始化你的Loader

代码语言:javascript
复制
if (getLoaderManager().getLoader(LOADER_ID) == null) {
    getLoaderManager().initLoader(LOADER_ID, bundle, loaderCallbacks);
} else {
    getLoaderManager().restartLoader(LOADER_ID, bundle, loaderCallbacks);

}

在这里,loaderCallbacks实现了常见的加载器回调

代码语言:javascript
复制
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) {
        ...
        ...
    }
};
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11293441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档