У меня есть фрагмент, реализующий LoaderManager и использующий CursorLoader (ничего особенного). Я хочу перехватывать исключения, возникающие во время запроса, но не понимаю, как это сделать !!! Любая помощь? Спасибо.
Обработка исключений CursorLoader
comment
Ваш вопрос немного непонятен. Какие исключения нужно ловить? Вы пробовали блоки try & catch?
- person Mohamed_AbdAllah   schedule 25.11.2012
comment
У меня примерно так:
- person denispyr   schedule 25.11.2012
comment
Мой фрагмент реализует LoaderManager и реализует onCreateLoader, onLoadFinished и onLoaderReset. Метод onCreateLoader создает экземпляр CursorLoader. Пока все хорошо, ничего особенного. Теперь предположим, что курсор выдает исключение, когда он пытается запустить и доставить контент во фрагмент. Где я могу его поймать? Имейте в виду, что мой код никогда явно не запускает курсор, это делает загрузчик.
- person denispyr   schedule 25.11.2012
comment
Я хочу сделать что-то похожее на AsyncTask и обработку ошибок на Android
- person denispyr   schedule 25.11.2012
comment
Итак, все запросы выполняются нормально все время!?!? Я единственный, кто получает исключение выполнения запроса и хочет их обработать?!?! (Я что-то делаю неправильно?)
- person denispyr   schedule 26.11.2012
comment
+1 за ваш вопрос. Я использую LoaderEx SQLiteCursorLoader и попытаюсь обработать его в источнике ... Недопустимо, чтобы запрос мог вывести из строя все приложение.
- person Rafael Nobre   schedule 05.12.2012
Ответы (2)
Для этого вам потребуется производный от CursorLoader. Что-то вроде этого:
class MyCursorLoader extends CursorLoader {
public MyCursorLoader(Context context) {
super(context)
}
public CursorLoader(Context context, Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
super(context, uri, projection, selection, selectionArgs, sortOrder);
}
@Override
public Cursor loadInBackground() {
try {
return (super.loadInBackground);
} catch (YourException e) {
// Do your thing.
}
return (null);
}
}
Вы можете адаптировать его для реализации вашей обработки ошибок.
person
jsmith
schedule
05.12.2012
Я попытался унаследовать и реализовать слушателя, затем попытался унаследовать и реализовать обратный вызов. Самым простым и менее навязчивым решением в моем случае кажется следующее
public class CursorLoaderGraceful extends CursorLoader {
public Throwable error; // holder
public CursorLoaderGraceful(Context context) {
super(context);
}
public CursorLoaderGraceful(Context context, Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
super(context, uri, projection, selection, selectionArgs, sortOrder);
}
public void OnQueryException(RuntimeException throwable) {
throw throwable;
}
@Override
public Cursor loadInBackground() {
try {
return (super.loadInBackground());
} catch (Throwable t) {
error = t; // keep it
}
return (null);
}
}
А во фрагменте / активности
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoaderGraceful loader = new CursorLoaderGraceful(this., other, params, go , here);
// ...
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
//trivial code
mAdapter.swapCursor(data);
if (this.isResumed()) {
this.setListShown(true);
} else {
this.setListShownNoAnimation(true);
}
//check and use
Throwable loaderError = ((CursorLoaderGraceful)loader).error;
if (loaderError != null) {
//all these just to show it?!?!? :/
Toast.makeText(this, loaderError.getMessage(), Toast.LENGTH_SHORT)
.show();
}
}
person
denispyr
schedule
06.12.2012