我想在我的项目中使用兼容性包实现一个AsyncTaskLoader,所以我遵循了Android中的Loader手册。
问题是装载机什么也不做,似乎从来没有调用过loadInBackground()
知道我的代码出了什么问题吗?(ExpandableListFragment扩展了Fragment,但没有覆盖任何关键方法)
谢谢:-)
/**EDIT:
我意识到(很晚了,我是个白痴) AsyncTaskLoader是一个抽象类,所以我需要子类它.M(__)I‘我离开这个问题,以防有人在我身后,谁知道……
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);
}
}发布于 2012-01-12 05:55:47
我认为兼容性包的最佳解决方案是重写AsyncTaskLoader.onStartLoading方法。
例如:
@Override
protected void onStartLoading() {
if(dataIsReady) {
deliverResult(data);
} else {
forceLoad();
}
}发布于 2011-12-27 00:40:42
这确实是一个解决办法,但它应该有效。我很确定兼容性库坏了。试试这个:
getLoaderManager().initLoader(0, null, this).forceLoad();发布于 2013-10-20 18:10:23
车仁成是绝对正确的:
检查takeContentChanged似乎也是重要的一步。
如果您像这样编写您的方法:
protected void onStartLoading() {
forceLoad();
}您会注意到,当一个子活动出现,然后返回到父活动时,onStartLoading (以及loadInBackground)再次被调用!
你能做什么?在构造函数中将内部变量(mContentChanged)设置为true;然后在onStartLoading中检查此变量。只有当为真时,才开始加载real:
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();
}
}
}https://stackoverflow.com/questions/8606048
复制相似问题