Обработка ошибок 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?

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Вы можете избежать использования дополнительной переменной с помощью метода cancel() и метода его обработчика onCancelled(). Когда вы вызываете отменить в 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...
    }
}