Обработка ошибок Asynctask - PullRequest
       11

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

16 голосов
/ 11 сентября 2010

Я использую 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 может быть записана / доступна как для основного, так и для рабочего потока. Поскольку я знаю, что onPostExecute() будет запущен только после завершения doInBackround(), могу ли я пропустить синхронизацию?

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

Ответы [ 3 ]

3 голосов
/ 12 сентября 2010

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

Вы можете избежать использования дополнительной переменной, используя метод cancel () и метод его обработчика onCancelled () .При вызове отмены в методе doInBackground () метод onCancelled в потоке пользовательского интерфейса.Звоните ли вы отменить (true) или отменить (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...
    }
}
3 голосов
/ 11 сентября 2010

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

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

2 голосов
/ 11 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...