8

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

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

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

4

1 回答 1

22

查看问题 14944 ( http://code.google.com/p/android/issues/detail?id=14944 ) 后,我通过覆盖onStartLoading()我的 customAsyncTaskLoader和 call解决了这个问题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;
    }
}
于 2011-09-20T08:05:12.553 回答