Обработка исключений изящно

У меня есть функция, которая делает HTTP-запрос и анализирует ответные данные JSON. Функция вызывается в классе AsyncTask. У меня есть функция, определенная, чтобы проверить, есть ли подключение, прежде чем вызывать asynctask. Но как только функция проверки соединения возвращает true... моя функция запускается в классе asynctask, и устройство теряет связь, и приложение закрывается.

private void parseJson()
{
    // HTTP request and JSON parsing done here
}

class getData extends AsyncTask <Void,Void,Void>
{


@Override
protected Void onPreExecute(Void...arg0)
{
    super.onPreExecute();
    //progress dialog invoked here
}

@Override
protected Void doInBackground(Void...arg0)
{
    parseJSON();
    return null;
}
@Override
protected Void onPostExecute(Void...arg0)
{
    super.onPostExecute();
    //UI manipulated here
}

}

как уведомить пользователя об исключении, возникающем в методе doInBackground(), и правильно обработать исключение, так как doInBackground() не разрешает такие вещи, как запуск сообщения toast.

3 ответа

Решение

Делай так

class getData extends AsyncTask <Void,Void,Boolaen>
{


@Override
protected Void onPreExecute(Void...arg0)
{
    super.onPreExecute();
    //progress dialog invoked here
}

@Override
protected Boolaen doInBackground(Void...arg0)
{
    try{ 
          parseJSON();
          return true;
    }catch(Exception e){
      e.printStackStrace();
    }

    return false;
}
@Override
protected Void onPostExecute(Boolaen result)
{
    super.onPostExecute(result);
    if(result){
      //success
    }else{
      // Failure
    } 

    //UI manipulated here
}

}

Мой подход выглядел так. Представляем универсальный AsyncTaskResult, где вы можете сохранить реальное возвращаемое значение (если оно вам нужно) или исключение, которое произошло в doInBackground(), В onPostExecute Вы можете проверить, произошло ли исключение, и уведомить своего пользователя (или обработать возвращаемое значение).

AsyncTaskResult:

public class AsyncTaskResult<T> {
    private T mResult;
    private Exception mException = null;

    public AsyncTaskResult() {
    }

    public AsyncTaskResult(T pResult) {
        this.mResult = pResult;
    }

    public AsyncTaskResult(Exception pException) {
        this.mException = pException;
    }

    public T getResult() {
        return mResult;
    }

    public boolean exceptionOccured() {
        return mException != null;
    }

    public Exception getException() {
        return mException;
    }
}

AsyncTask:

public class RessourceLoaderTask extends AsyncTask<String, String, AsyncTaskResult<String>> {

    public RessourceLoaderTask() {
    }

    @Override
    protected AsyncTaskResult<String> doInBackground(String... params) {
        try {
            // Checked Exception
        } catch (Exception e) {
            return new AsyncTaskResult<String>(e);
        }
        return new AsyncTaskResult<String>();
    }

    @Override
    protected void onPostExecute(AsyncTaskResult<String> pResult) {
        if (!pResult.exceptionOccured()) {
            //...
        } else {
            // Notify user
        }

    }
}

Сделать поле в getData учебный класс. Установите это в doBackground, проверьте это в onPostExecute,

Другие вопросы по тегам