如何在Android中的AsyncTask中向用户显示错误消息?

时间:2016-08-17 18:41:39

标签: android exception android-asynctask

我正在使用AsyncTask将数据从我创建的Web服务中获取。现在我想向用户显示正确的错误消息,就像互联网不可用一样,如果服务器关闭,它将同样显示吐司,它将为此显示吐司。我想在doInBackground()中设置一个错误,如“服务器已关闭”或“发生网络问题”,并在onPostExecute()中显示Toast,但我想知道我的服务器是否已关闭,抛出了什么异常?如果我的服务器处于活动状态,但在传输期间,互联网已断开连接,那么会抛出什么异常?

2 个答案:

答案 0 :(得分:0)

对响应建模可能是最好和最简单的方法。

例如,

您可以根据所获得的数据撰写模型,例如:

   class ApiResponse {
          public final String responseString;
          public final Throwable error;

        public ApiResponse (String responseString,Throwable  error){
          this.responseString  = responseString;
          this.error = error;
        }
    }

然后,您可以将响应或错误绑定到该模型并从doInBackground();

返回

伪代码:

class ApiAsyncTask extends AsyncTask<Void, Void, ApiResponse> {
    ....

    protected ApiResponse doInBackground() {

        try {
            //callApi and get response, if success pass null in error
            return new ApiResponse(responseString, null)
        } catch (Exception e) {
            e.printStackTrace();
            //otherwise pass that error
            return new ApiResponse(null, e);
        }
    }

    protected void onPostExecute(ApiResponse apiResponse) {
        //now just need to check if error is null 
        if (error == null) {
            String json = apiResponse.responseString;
            //parse response   
        } else {
            //get error and check with instanceOf
            Throwable error = apiResponse.error;
            if (error instanceOf SocketTimeoutException){
                //show timeout error
            }
            else if (error instanceOf SomeXYZException){
                //handle that exception
            }
        }
    }
}

这只是一个例子。您可以在ApiResponse中放置任何内容,并撰写该数据的模型。 (例如从api获取的状态代码,通过某些转换器生成的json响应的pojo类等等)。一旦数据受限,就可以在onPostExecute()中使用它,因为它将始终在您的UI线程上运行。请注意,Result的第三类型参数AsyncTask是根据定义构建的:AsyncTask<Params, Progress, Result>

答案 1 :(得分:0)

doInBackground()的例外捕获到字符串中,并且根据您的需要,您可以显示来自onPostExecute()方法的Toast消息,如下所示:

@Override
protected Void doInBackground(Void... arg0) {

try {
            // do you stuff here


        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
        } catch (IOException e) {
            e.printStackTrace();
            response = "IOException: " + e.toString();
        } finally {
           ...

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

@Override
protected void onPostExecute(Void result) {
        if (response.contains("IOException: java.net.ConnectException:")) {
            Toast.makeText(getApplicationContext(), "YOUR TEXT HERE", Toast.LENGTH_SHORT).show();
            mProgressDialog.dismiss();
        }
        else if (response.contains("IOException: java.net.SocketTimeoutException:")) {
            Toast.makeText(getApplicationContext(), "YOUR TEXT HERE", Toast.LENGTH_SHORT).show();
            mProgressDialog.dismiss();
        }
        else if (response.contains("IOException: java.net.SocketException:")) {
            Toast.makeText(getApplicationContext(), "YOUR TEXT HERE", Toast.LENGTH_SHORT).show();
            mProgressDialog.dismiss();
        }
}

当然,这只是一个例子,但你可以看到如何解决这个问题。