【问题标题】:onLoadFinished not called after coming back from a HOME button press按下 HOME 按钮返回后未调用 onLoadFinished
【发布时间】:2011-09-19 17:18:49
【问题描述】:

当使用自定义AsyncTaskLoader从Web服务下载数据时,如果我在加载过程中按HOME按钮然后再次进入应用程序,则不会调用onLoadFinished()方法。我的片段在onActivityCreated() 中调用setRetainInstance(true),它还以相同的方法调用getLoaderManager.initLoader(0, null, this)(推荐)。

在测试时,我看到返回片段时onActivityCreated() 未被调用,所以这可能是onLoadFinished() 未被调用的原因。但是initLoader() 方法还可以放在哪里呢?我在几个地方读到过不应在onResume() 中调用它。

那么,有什么想法吗?我的应用程序的各个屏幕上有很多加载程序,我需要以一种优雅的方式解决这个问题。

【问题讨论】:

  • 您在哪里读到不应在 onResume() 中调用 initloader,因为这正是解决框架错误 code.google.com/p/android/issues/detail?id=63179 所需的内容
  • @faizal 我真的不记得了。我很久以前就不再使用装载机了。许多专家开发人员根据经验建议不要使用加载器来获取网络数据。

标签: android fragment


【解决方案1】:

查看问题 14944 (http://code.google.com/p/android/issues/detail?id=14944) 后,我通过在我的自定义 AsyncTaskLoader 中覆盖 onStartLoading() 并调用 forceLoad() 解决了这个问题。

更好的解决方案是创建一个看起来像这样的自定义父 AsyncTaskLoader(取自 alexvem 从上面的链接中提出的建议):

public abstract class AsyncLoader<D> extends AsyncTaskLoader<D> {

    private D data;

    public AsyncLoader(Context context) {
        super(context);
    }

    @Override
    public void deliverResult(D data) {
        if (isReset()) {
            // An async query came in while the loader is stopped
            return;
        }

        this.data = data;

        super.deliverResult(data);
    }


    @Override
    protected void onStartLoading() {
        if (data != null) {
            deliverResult(data);
        }

        if (takeContentChanged() || data == null) {
            forceLoad();
        }
    }

    @Override
    protected void onStopLoading() {
         // Attempt to cancel the current load task if possible.
        cancelLoad();
    }

    @Override
    protected void onReset() {
        super.onReset();

        // Ensure the loader is stopped
        onStopLoading();

        data = null;
    }
}

【讨论】:

  • 通过覆盖 onStartLoading() 并在其中调用 forceLoad() 为我解决了问题。
猜你喜欢
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多