AsyncTask и обработка ошибок на Android - PullRequest
144 голосов
/ 16 ноября 2009

Я конвертирую свой код из Handler в AsyncTask. Последний великолепен в том, что он делает - асинхронные обновления и обработка результатов в основном потоке пользовательского интерфейса. Что мне неясно, так это то, как обрабатывать исключения, если что-то выходит из строя в AsyncTask#doInBackground.

Способ, которым я это делаю, - это иметь обработчик ошибок и отправлять ему сообщения. Он отлично работает, но это "правильный" подход или есть лучшая альтернатива?

Также я понимаю, что если я определяю обработчик ошибок как поле Activity, он должен выполняться в потоке пользовательского интерфейса. Однако иногда (очень непредсказуемо) я получаю Исключение, говорящее, что код, запущенный из Handler#handleMessage, выполняется в неправильном потоке. Должен ли я вместо этого инициализировать обработчик ошибок в Activity#onCreate? Размещение runOnUiThread в Handler#handleMessage кажется излишним, но выполняется очень надежно.

Ответы [ 12 ]

0 голосов
/ 04 февраля 2012

Если вы знаете правильное исключение, вы можете позвонить на

Exception e = null;

publishProgress(int ...);

Например:

@Override
protected Object doInBackground(final String... params) {

    // TODO Auto-generated method stub
    try {
        return mClient.call(params[0], params[1]);
    } catch(final XMLRPCException e) {

        // TODO Auto-generated catch block
        this.e = e;
        publishProgress(0);
        return null;
    }
}

и перейдите к «onProgressUpdate» и выполните следующее

@Override
protected void onProgressUpdate(final Integer... values) {

    // TODO Auto-generated method stub
    super.onProgressUpdate(values);
    mDialog.dismiss();
    OptionPane.showMessage(mActivity, "Connection error", e.getMessage());
}

Это будет полезно только в некоторых случаях. Также вы можете сохранить переменную Global Exception и получить доступ к исключению.

0 голосов
/ 20 января 2011

Лично я буду использовать этот подход. Вы можете просто перехватить исключения и распечатать трассировку стека, если вам нужна информация.

заставить вашу задачу в фоновом режиме возвращать логическое значение.

это так:

    @Override
                protected Boolean doInBackground(String... params) {
                    return readXmlFromWeb(params[0]);
         }

        @Override
                protected void onPostExecute(Boolean result) {

              if(result){
              // no error
               }
              else{
                // error handling
               }
}
...