2012-02-24 115 views
0

目前我正在实施网络通信层。我认为先与更有经验的Android开发人员进行磋商是一件好事。网络通信层。 AsyncTask错误处理

我有一个名为WebApiController的类,负责:请求和解析响应,并将它们存储在模型中。 WebApiController方法在主线程上执行,因此我将它们包装在AsyncTasks中以将负载从主线程中取出。 WebApiController方法可能会抛出异常,如ServerBadResponseException,XmlParserException等。我希望能够根据错误类型处理它们(即根据错误类型显示不同的错误消息)。那么,通知onPostExecute关于错误类型的最好方法是什么,并且很好地处理它。

+0

'我有一些想法如何处理这个问题,但我不舒尔他们很good'如何分享你的想法? – WarrenFaith 2012-02-24 09:16:26

+0

=)好的。枚举我们可以发送给onPostExecute的错误,然后在那里处理它,或者在doInBackround中运行runOnUiThread。但是它们对我来说很糟糕 – 2012-02-24 09:27:19

回答

1

或者这样:

class SomeTask extends AsyncTask<Void, Void, Params> { 

    @Override 
    protected Params doInBackground(Void... voids) { 
     Params params = new Params(); 
      try { 
       ..... 
       params._result = ..... 
      } catch (Throwable e) { 
       params._error = e; 
      } 
     return params; 
    } 

    @Override 
    protected void onPostExecute(Params params) { 
     if(params._error != null){ 
      .... 
     } else { 
      .... 
     } 
    } 
} 

class Params { 
    public Throwable _error; 
    public Object _result; 
} 
0

你可以试试这个(在doInBackgroung法):

 try { 
      ........ 
     } catch (final Throwable e) { 
      runOnUiThread(new Runnable() { 
       public void run() { 
        Log.e(TAG, e.getMessage(), e); 
        Toast.makeText(......).show(); 
       } 
      }); 
     } 
1

基本上最简单的方法是设置一个返回代码,如 “成功”, “FAILURE_XY” 和在您的onPostExecute()中处理。这个作品也,当你通常会返回数据...

doInBackground() { 
    try { 
     // code 
     return data; 
    } catch (Exception e) { 
     Log.e(TAG, "error description", e); 
     resultCode = FAILURE; 
     return null; 
    } 
} 

onPostExecute(Data data) { 
    if (data == null) { 
     // check resultCode! 
    } else { 
     // work with your data 
    } 
} 
+0

@appserv显示的基本上是你正在寻找的东西。对于基本的结果代码至少要有一个Enum或简单的整数是很重要的。根据UX,您应该向用户显示错误消息本身。只需记录它们并向用户显示出现问题。甚至不要开始向他们展示真正的异常信息! – WarrenFaith 2012-02-24 10:37:39

+0

那就是我的意思 – WarrenFaith 2012-02-24 13:41:44