Обработка ошибок Asynctask

Я использую AsyncTask для выполнения некоторых фоновых вычислений, но я не могу найти правильный способ обработки исключений. В настоящее время я использую следующий код:

 private class MyTask extends AsyncTask<String, Void, String> { private int e = 0; @Override protected String doInBackground(String... params) { try { URL url = new URL("http://www.example.com/"); } catch (MalformedURLException e) { e = 1; } // Other code here... return null; } @Override protected void onPostExecute(String result) { if (e == 1) Log.i("Some Tag", "An error occurred."); // Perform post processing here... } } 

Я считаю, что переменная e maye может быть записана / доступна как основным, так и рабочим потоком. Поскольку я знаю, что onPostExecute() будет запущен только после doInBackround() , могу ли я опустить любую синхронизацию?

Это плохой код? Есть ли согласованный или правильный способ обработки исключений в AsyncTask ?

Solutions Collecting From Web of "Обработка ошибок Asynctask"

Я делаю это в своих приложениях, я думаю, что нет лучшего способа.

Вы также можете прочитать ответ Марка Мерфи об этом.

Это гарантированно работает даже на архитектуре SMP. Вся синхронизация выполняется для вас. Однако было бы лучше использовать возвращаемое значение для этого.

Я думаю, что ваш код будет работать, но уже есть некоторая обработка ошибок, встроенная в класс AsyncTask .

Вы можете избежать использования дополнительной переменной с помощью метода cancel () и метода обработчика onCancelled () . Когда вы вызываете cancel в методе doInBackground (), метод onCancelled в потоке пользовательского интерфейса. Если вы вызываете cancel (true) или cancel (false), зависит от ваших потребностей.


 private class MyTask extends AsyncTask<String, Void, String> { @Override protected NewsItem doInBackground(String... params) { try { URL url = new URL("http://www.example.com/"); } catch (MalformedURLException e) { cancel(false/true); } // Other code here... return null; } @Override protected void onPostExecute(String result) { // Perform successful post processing here... } @Override protected void onCancelled() { super.onCancelled(); // Perform error post processing here... } }