AsyncTaskLoader不运行

Ait*_*mez 30 android asynctaskloader

我想使用兼容包在我的项目中实现AsyncTaskLoader,所以我遵循Android Docs中的Loader手册.

问题是Loader什么都不做,似乎loadInBackground()永远不会被调用

知道我的代码有什么问题吗?(ExpandableListFragment扩展Fragment,但不覆盖任何关键方法)

谢谢 :-)

/**编辑:

我意识到(最近,我是个白痴),AsyncTaskLoader是一个抽象类,所以我需要将它子类化... m(__)m我留下问题以防有人来到我身后,谁知道......

public class AgendaListFragment extends ExpandableListFragment implements
        LoaderManager.LoaderCallbacks<JSONArray> {

    private TreeMap<Integer, ArrayList<Evento>> mItems = new TreeMap<Integer, ArrayList<Evento>>();
    private AgendaListAdapter mAdapter;
    private ProgressBar mProgressBar;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_agenda, container);
        mProgressBar = (ProgressBar) root.findViewById(R.id.loading);
        return root;

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mAdapter = new AgendaListAdapter(getActivity());
        setListAdapter(mAdapter);

        getLoaderManager().initLoader(0, null, this);

    }

    @Override
    public Loader<JSONArray> onCreateLoader(int arg0, Bundle arg1) {
        mProgressBar.setVisibility(View.VISIBLE);
        return new AsyncTaskLoader<JSONArray>(getActivity()) {
            @Override
            public JSONArray loadInBackground() {

                return getDataFromService(AgendaServices.LISTADO_MES);

            }

        };
    }

    @Override
    public void onLoadFinished(Loader<JSONArray> loader, JSONArray data) {

        // Some stuff to turn JSONArray into TreeMap

        mProgressBar.setVisibility(View.GONE);
        mAdapter.setItems(mItems);

    }

    @Override
    public void onLoaderReset(Loader<JSONArray> arg0) {
        mAdapter.setItems(null);
        mProgressBar.setVisibility(View.VISIBLE);

    }

}
Run Code Online (Sandbox Code Playgroud)

Dav*_* S. 63

我认为兼容包的最佳解决方案是覆盖AsyncTaskLoader.onStartLoading方法.

例如

@Override
protected void onStartLoading() {
  if(dataIsReady) {
    deliverResult(data);
  } else {
    forceLoad();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 检查`takeContentChanged`似乎也是一个重要的步骤. (2认同)

dba*_*ugh 8

这只是一个修复,但它应该工作.我很确定兼容性库已被破坏.试试这个:

getLoaderManager().initLoader(0, null, this).forceLoad();
Run Code Online (Sandbox Code Playgroud)

  • 这样可行,但实际上你可以更好地实现你的`Loader <D>`(正如davidshen84建议的那样,实现`onStartLoading()`方法)而不是直接在你的`Activity`中调用`forceLoad()`和/或者'片段'. (5认同)