【问题标题】:Network communication layer. AsyncTask error handling [duplicate]网络通信层。 AsyncTask 错误处理 [重复]
【发布时间】:2012-03-14 17:39:19
【问题描述】:

目前我正在实现网络通信层。而且我认为最好先咨询更有经验的 Android 开发人员。

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

【问题讨论】:

  • I have some ideas how to handle this but I don't shure they are very good 分享你的想法怎么样?
  • =) 好的。带有错误的枚举,我们可以发送到 onPostExecute,然后在那里处理它,或者在 doInBackround 中运行 OnUiThread。但它们对我来说很糟糕

标签: android android-asynctask


【解决方案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;
}

【讨论】:

    【解决方案2】:

    基本上最简单的方法是设置一个返回码,如“SUCCESS”、“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
        }
    }
    

    【讨论】:

    • @appserv 显示的内容基本上就是您要查找的内容。对于基本结果代码,至少有一个 Enum 或简单整数是很重要的。根据 UX,您应该向用户显示错误消息本身。只需记录它们并向用户显示出了问题。甚至不要开始向他们显示真正的异常消息!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 2013-05-11
      相关资源
      最近更新 更多