Я заметил некоторые IllegalStateException
сбои в моем аналитическом отчете, которые я не могу воспроизвести. Я делаю что-то структурно неправильное здесь? Я включил некоторый псевдокод, который, надеюсь, показывает скелет моего фрагмента, не будучи слишком загроможденным. Я не помню, чтобы видел эту ошибку, пока не провел рефакторинг своего кода для использования фрагментов. Ошибка возникает в AsyncTask onPostExecute
. Пожалуйста, дайте мне знать, если я могу лучше объяснить свою проблему/псевдокод.
public class MyListFragment extends ListFragment
implements LoaderManager.LoaderCallbacks<Cursor> {
Fragment fragment = this;
SimpleCursorAdapter adapter;
// onActivityCreated initializes the adapter and the loader
public AsyncTaskLoader<Cursor> onCreateloader(int id, Bundle bundle) {
return new CustomCursorLoader(this);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
private class CustomCursorLoader extends CursorLoader {
public CustomCursorLoader(Fragment fragment) {
// get a handle to the OrmLite database helper class
databaseHelper = (DatabaseHelper) OpenHelperManager.getHelper(fragment.getActivity(), DatabaseHelper.class);
}
public Cursor loadInBackground() {
// construct the Cursor that will be used for loading results from the SQLite database
}
}
private class Task extends AsyncTask {
// pre execute
// grab some new database results from the server and repopulate the SQLite database using OrmLite
public void onPostExecute() {
fragment.getLoaderManager().restartLoader(LOADER_ID, null, fragment);
}
}
}
Обновить
Я смог воспроизвести проблему, инициировав Task
, а затем сразу же нанеся ответный удар. Когда Task
завершает действие, содержащее фрагмент, становится неактивным, поэтому вызов getLoaderManager
завершается ошибкой. Теперь вопрос в том, какой самый элегантный способ справиться с этим? Я полагаю, я могу просто поймать Exception.
Обновление 2
Я считаю, что могу использовать отмену, чтобы предотвратить выполнение onPostExecute
. Если я это сделаю, мне, вероятно, потребуется переместить initLoader
в другой метод, чем onActivityCreated
, чтобы обновить загрузчик, когда пользователь вернется на страницу (поскольку результаты обновляются, а не загрузчик).
Обновление 3
Мне интересно, как упоминает Робби Понд в комментариях, не является ли использование загрузчика здесь излишним?
EasyTracker
в аналитике, поэтому все, что я получаю, это имя исключения и номер строки. Я не могу воспроизвести проблему локально. - person theblang   schedule 25.02.2014onActivityCreated
. В противном случае, вonOptionsItemSelected
, когда они нажмут элемент панели действий обновления. - person theblang   schedule 25.02.2014ListView
, а неnotifyDataSetChanged
. В какой-то момент я выполнял повторный запрос в AsyncTask, но переключился на загрузчики. - person theblang   schedule 25.02.2014Task
, а затем сразу же наношу ответный удар. Когда Задача завершается, мы больше не находимся в действии, содержащем фрагмент, поэтомуgetLoaderManager
терпит неудачу. - person theblang   schedule 25.02.2014AsyncTask
, я могу просто манипулировать курсором адаптера там, а не использовать такжеLoader
. Вам никогда не понадобится загрузчик, если вы уже обновляете данные асинхронно? - person theblang   schedule 26.02.2014Loader
и просто используюswapCursor
в своемAsyncTask
. Вы были правы, предполагая, что я не должен использовать обаLoader and AsyncTask
. Если вы хотите оставить свой комментарий в качестве ответа, я приму его. - person theblang   schedule 19.03.2014