使用自定义AsyncTaskLoader
从Web服务下载数据时,如果我在加载过程中按HOME按钮然后再次进入应用程序,则不会调用onLoadFinished()方法。我的片段在setRetainInstance(true)
中调用了onActivityCreated()
,并且它也以相同的方法调用getLoaderManager.initLoader(0, null, this)
(推荐)。
在测试时,我发现当回到片段onActivityCreated()
时没有被调用,所以这可能是为什么onLoadFinished()
没有被调用的原因。但是在哪里放置initLoader()
方法呢?我在几个地方读到它不应该在onResume()
中调用。
那么,有什么想法吗?我的应用程序在各种屏幕上都有很多加载器,我需要以优雅的方式解决这个问题。
答案 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;
}
}