10

我有一个SherlockListFragment实现自定义的AsyncTaskLoader. 在被覆盖的onStartLoading()中,我有:

@Override
protected void onStartLoading() {
  if (mData != null) {
    deliverResult(mData);
  }
  else{
    forceLoad();
  }
}

包含SherlockListFragment在以下位置启动加载程序onActivityCreated

@Override
public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);
  mAdapter = new MyListAdapter(getActivity());
  setListAdapter(mAdapter);
  getLoaderManager().initLoader(0, null, this);
}

和 :

@Override
public Loader<List<MyData>> onCreateLoader(int id, Bundle args) {
  return new MyListLoader(getActivity());
}

问题是在 5 次激活/导航到我的 FragmentActivity 之后,loadinBackground()没有调用。被onStartLoding称为,以及forceLoad,但仅此而已。没有例外,LogCat 中没有任何内容。

有任何想法吗?

4

1 回答 1

3

可以调用forceLoad()

查看文档中的内容:您通常应该只在加载程序启动时调用它 - 即 isStarted() 返回 true

完整代码:

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

        Log.d(TAG, "onStartLoading() ");
    } catch (Exception e) {
        Log.d(TAG, e.getMessage());
    }
}

重要的:

文档说子类Loader<D>通常必须至少实现onStartLoading()、onStopLoading()、onForceLoad() 和 onReset()

AsyncTaskLoader 扩展了 Loader 但没有实现onStartLoading(), onStopLoading(), onReset()。你必须自己实现它!


PS 在使用简单的 CursorLoader 之后,我对它感到困惑,我还认为使用 forceLoad() 是不好的做法。但事实并非如此。

于 2016-08-17T09:40:43.687 回答