从HOME按钮返回后,onLoadFinished未调用

时间:2011-09-19 17:18:49

标签: android fragment

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

在测试时,我发现当回到片段onActivityCreated()时没有被调用,所以这可能是为什么onLoadFinished()没有被调用的原因。但是在哪里放置initLoader()方法呢?我在几个地方读到它不应该在onResume()中调用。

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

1 个答案:

答案 0 :(得分:22)

在查看问题14944(http://code.google.com/p/android/issues/detail?id=14944)后,我通过在我的自定义onStartLoading()中覆盖AsyncTaskLoader并致电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;
    }
}