15

我使用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可以写入/访问的主和工作线程。据我所知只有在doInBackround()完成后才能运行,我可以省略任何同步吗?

这是错的代码? AsyncTask有没有一个同意或正确的方法来处理异常?

+1

可能重复(http://stackoverflow.com/questions/1739515/asynctask-and-error-handling-on-android) – blahdiblah 2012-04-11 19:35:09

回答

3

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

您还可以阅读关于它的Mark Murphy answer

+0

如果它不会造成问题然后我很高兴! – Leo 2010-09-11 12:40:45

2

即使在SMP架构上,这也能保证正常工作。所有的同步都是为你完成的。然而,使用返回值来做到这一点会更好。

+1

在实际的代码中,我使用自定义对象作为返回类型,它并不真正适用于保存异常信息。我假设我不能轻易重载'onPostExecute()'函数? – Leo 2010-09-11 20:14:31

+4

首先,doInBackground必须返回与onPostExecute()中的参数类型相同的对象。然后你可以创建一个自定义类来封装结果+异常:class ResultHolder {Exception e; MyResult r; } – 2010-09-11 21:18:58

2

我认为你的代码可以工作,但已经有一些内置于AsyncTask类的错误处理。

您可以通过使用cancel()方法及其处理程序方法onCancelled()避免使用额外变量。在UI线程中调用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... 
    } 
} 
的[的AsyncTask和错误处理在Android]
+0

这种方法只适用于我们有一种类型的异常。在我的完整代码中有很多事情可能会出错,他们必须以不同的方式处理。 – Leo 2010-09-12 18:53:51

+0

为什么?您可以添加到try-clause中尽可能多的catch-class。在每个catch语句中,你都可以调用cancel-Method。你也可以捕获(例外e),它捕获所有类型的异常。我有没有对你,利奥?但是,在抛出异常或者是否有其他方式执行异常处理时调用cancel()是否是一种好的做法? – OneWorld 2010-10-12 14:53:30

+0

处理错误的cancel()方法非常接近实际发生的情况。由于错误,您的处理已被取消。你仍然可以在ASyncTask上保存一些可以被UI线程读取的状态,以获得有关错误的更多信息。 – DukeMe 2015-02-03 21:01:24