Обработка исключений изящно
У меня есть функция, которая делает 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
,