16

我正在使用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

4

3 回答 3

3

我一直在我的应用程序中这样做,我想没有更好的方法。

您还可以阅读Mark Murphy 对此的回答

于 2010-09-11T12:33:39.497 回答
3

我认为您的代码可以胜任这项工作,但AsyncTask类中已经内置了某种错误处理。

您可以通过使用cancel()方法及其处理程序方法onCancelled()来避免使用额外的变量。当您在doInBackground()方法中调用取消时,UI 线程中的 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...
    }
}
于 2010-09-12T11:36:53.153 回答
2

这保证可以工作,即使在 SMP 架构上也是如此。所有同步都为您完成。但是,最好使用返回值来执行此操作。

于 2010-09-11T18:50:29.543 回答