Обработка исключений CursorLoader

У меня есть фрагмент, реализующий LoaderManager и использующий CursorLoader (ничего особенного). Я хочу перехватывать исключения, возникающие во время запроса, но не понимаю, как это сделать !!! Любая помощь? Спасибо.


person denispyr    schedule 25.11.2012    source источник
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