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

Cat*_*san 8 android fragment

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

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

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

Cat*_*san 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;
    }
}
Run Code Online (Sandbox Code Playgroud)