首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncTaskLoader不运行

AsyncTaskLoader不运行
EN

Stack Overflow用户
提问于 2011-12-22 15:31:32
回答 7查看 10.8K关注 0票数 30

我想在我的项目中使用兼容性包实现一个AsyncTaskLoader,所以我遵循了Android中的Loader手册。

问题是装载机什么也不做,似乎从来没有调用过loadInBackground()

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

谢谢:-)

/**EDIT:

我意识到(很晚了,我是个白痴) AsyncTaskLoader是一个抽象类,所以我需要子类它.M(__)I‘我离开这个问题,以防有人在我身后,谁知道……

代码语言:javascript
复制
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);

    }

}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-01-12 05:55:47

我认为兼容性包的最佳解决方案是重写AsyncTaskLoader.onStartLoading方法。

例如:

代码语言:javascript
复制
@Override
protected void onStartLoading() {
  if(dataIsReady) {
    deliverResult(data);
  } else {
    forceLoad();
  }
}
票数 63
EN

Stack Overflow用户

发布于 2011-12-27 00:40:42

这确实是一个解决办法,但它应该有效。我很确定兼容性库坏了。试试这个:

代码语言:javascript
复制
getLoaderManager().initLoader(0, null, this).forceLoad();
票数 8
EN

Stack Overflow用户

发布于 2013-10-20 18:10:23

车仁成是绝对正确的:

检查takeContentChanged似乎也是重要的一步。

如果您像这样编写您的方法:

代码语言:javascript
复制
protected void onStartLoading() {
    forceLoad();
}

您会注意到,当一个子活动出现,然后返回到父活动时,onStartLoading (以及loadInBackground)再次被调用!

你能做什么?在构造函数中将内部变量(mContentChanged)设置为true;然后在onStartLoading中检查此变量。只有当为真时,才开始加载real:

代码语言:javascript
复制
package example.util;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public abstract class ATLoader<D> extends AsyncTaskLoader<D> {

    public ATLoader(Context context) {
        super(context);
        // run only once
        onContentChanged();
    }

    @Override
    protected void onStartLoading() {
        // That's how we start every AsyncTaskLoader...
        // -  code snippet from  android.content.CursorLoader  (method  onStartLoading)
        if (takeContentChanged()) {
            forceLoad();
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8606048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档