AsyncTaskLoader不运行

我想使用Compatibility Package在我的项目中实现一个AsyncTaskLoader,所以我遵循Android Docs中的Loader手册。

问题是Loader什么都不做,看起来loadInBackground()永远不会被调用

任何想法在我的代码中有什么问题? ( ExpandableListFragment扩展了Fragment ,但不覆盖任何关键的方法)

谢谢 :-)

/**编辑:

我意识到(最近,我是一个白痴),AsyncTaskLoader是一个抽象类,所以我需要inheritance它… 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); } } 

Solutions Collecting From Web of "AsyncTaskLoader不运行"

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

例如

 @Override protected void onStartLoading() { if(dataIsReady) { deliverResult(data); } else { forceLoad(); } } 

这完全是一个修复,但它应该工作。 我很确定兼容性库已经损坏。 尝试这个:

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

蔡成成绝对是对的:

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

如果你这样写你的方法:

 protected void onStartLoading() { forceLoad(); } 

你会注意到,当一个孩子的活动出现,然后你回到父母, onStartLoading (和loadInBackground )再次被调用!

你能做什么? 在构造函数中设置一个内部variables( mContentChanged )为true; 然后在onStartLoading检查这个variables。 只有当这是真的,开始加载真实:

 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://code.google.com/p/android/issues/detail?id=14944上的讨论,检&#x67E5;takeContentChanged似乎也是重要的一步。

 protected void onStartLoading() { if (mCursor != null) { deliverResult(mCursor); } if (takeContentChanged() || mCursor == null) { forceLoad(); } } 

我从android框架中获取了CursorLoader的源代码,并编写了一个CustomTaskLoader<T>类来缓解这个工作。

https://github.com/Palatis/danbooru-gallery-android/blob/new_api/DanbooruGallery/src/main/java/tw/idv/palatis/danboorugallery/android/content/CustomTaskLoader.java

你基本上实现了这两个function:

 public abstract T runTaskInBackground(CancellationSignal signal); public abstract void cleanUp(T oldResult); 

请参阅活动和片段中的用法,例如:(我的代码只是忽略CancellationSignal ,它是我的列表中的一个TODO ,但是您可以自由使用它)。

https://github.com/Palatis/danbooru-gallery-android/blob/new_api/DanbooruGallery/src/main/java/tw/idv/palatis/danboorugallery/PostListFragment.java

 return new CustomTaskLoader<Cursor>(getActivity().getApplicationContext()) { @Override public Cursor runTaskInBackground(CancellationSignal signal) { return SiteSession.getAllPostsCursor(PostListAdapter.POST_COLUMNS); } @Override public void cleanUp(Cursor oldCursor) { if (!oldCursor.isClosed()) oldCursor.close(); } } 

从CursorLoader迁移到AsyncTaskLoader后,我遇到了同样的问题。

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

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

@ davidshen84提出了很好的解决scheme。 我只添加了检查takeContentChanged。

 @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()); } } 

使用forceLoad()是好的(不是一个坏习惯)。 看看有什么文件说 :
通常只有在加载程序启动时才应该调用这个函数 – 也就是说,isStarted()返回true。

我仍然有问题,没有调用数据加载。 我终于删除了AsyncTaskLoader (支持库版本),只使用AsyncTask (不支持库)来完成这个工作。 它的工作。

这也足以满足您的需求。

说明和示例: http : //developer.android.com/reference/android/os/AsyncTask.html 。

你必须扩展类AsyncTask

方法doInBackground将执行工作,并在方法onPostExecute你会得到结果。 为了启动AsyncTask ,你将在其实例上调用execute方法。 看链接。