Android排球:如何处理错误回复

时间:2015-07-17 12:00:42

标签: android exception android-volley

我实现了一个带有排球库的Android应用程序来连接我的数据库。与' get'的关联和'发布'请求它工作,但服务器响应不起作用。 发生这种情况是因为错误响应会自动捕获错误(例如我的服务器响应,代码201表示登录成功,但是凌空untersand就像错误一样)。

我从类Request:

覆盖parseNetworkError
 @Override
    protected VolleyError parseNetworkError(VolleyError volleyError) {
        String parsed;
        NetworkResponse networkResponse = volleyError.networkResponse;
        if(networkResponse != null && networkResponse.data != null) {
            try {
                parsed = new String(networkResponse.data, HttpHeaderParser.parseCharset(networkResponse.headers));
            } catch (UnsupportedEncodingException var4) {
                parsed = new String(networkResponse.data);
            }
            NetworkResponse response = new NetworkResponse(networkResponse.data);
            Response<String> parsedResponse;
            switch(response.statusCode){
                case 204:                        
                    ...
                case 401:
                    ...
                default:
                    return volleyError;
            }
        }

        return super.parseNetworkError(volleyError);
    }

问题是VolleyError。此类扩展了Exception而不包含信息(代码错误)。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:8)

你可以像这样处理

@Override
public void onErrorResponse(VolleyError error) {
    // Handle your error types accordingly.For Timeout & No connection error, you can show 'retry' button.
    // For AuthFailure, you can re login with user credentials.
    // In this case you can check how client is forming the api and debug accordingly.
    // For ServerError 5xx, you can do retry or handle accordingly.
    if( error instanceof NetworkError) {
    //handle your network error here.
    } else if( error instanceof ServerError) {
    //handle if server error occurs with 5** status code
    } else if( error instanceof AuthFailureError) {
    //handle if authFailure occurs.This is generally because of invalid credentials
    } else if( error instanceof ParseError) {
    //handle if the volley is unable to parse the response data.
    } else if( error instanceof NoConnectionError) {
    //handle if no connection is occurred
    } else if( error instanceof TimeoutError) {
    //handle if socket time out is occurred.
    }

}

答案 1 :(得分:0)

这是我在项目中使用的:

    @Override
    public void onErrorResponse(VolleyError error) {
        if(error instanceof NoConnectionError){
            ConnectivityManager cm = (ConnectivityManager)mContext
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetwork = null;
            if (cm != null) {
                activeNetwork = cm.getActiveNetworkInfo();
            }
            if(activeNetwork != null && activeNetwork.isConnectedOrConnecting()){
                Toast.makeText(getActivity(), "Server is not connected to internet.",
                        Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getActivity(), "Your device is not connected to internet.",
                        Toast.LENGTH_SHORT).show();
            }
        } else if (error instanceof NetworkError || error.getCause() instanceof ConnectException 
                || (error.getCause().getMessage() != null 
                && error.getCause().getMessage().contains("connection"))){
            Toast.makeText(getActivity(), "Your device is not connected to internet.", 
                    Toast.LENGTH_SHORT).show();
        } else if (error.getCause() instanceof MalformedURLException){
            Toast.makeText(getActivity(), "Bad Request.", Toast.LENGTH_SHORT).show();
        } else if (error instanceof ParseError || error.getCause() instanceof IllegalStateException
                || error.getCause() instanceof JSONException
                || error.getCause() instanceof XmlPullParserException){
            Toast.makeText(getActivity(), "Parse Error (because of invalid json or xml).", 
                    Toast.LENGTH_SHORT).show();
        } else if (error.getCause() instanceof OutOfMemoryError){
            Toast.makeText(getActivity(), "Out Of Memory Error.", Toast.LENGTH_SHORT).show();
        }else if (error instanceof AuthFailureError){
            Toast.makeText(getActivity(), "server couldn't find the authenticated request.", 
                    Toast.LENGTH_SHORT).show();
        } else if (error instanceof ServerError || error.getCause() instanceof ServerError) {
            Toast.makeText(getActivity(), "Server is not responding.", Toast.LENGTH_SHORT).show();
        }else if (error instanceof TimeoutError || error.getCause() instanceof SocketTimeoutException
                || error.getCause() instanceof ConnectTimeoutException 
                || error.getCause() instanceof SocketException
                || (error.getCause().getMessage() != null 
                && error.getCause().getMessage().contains("Connection timed out"))) {
            Toast.makeText(getActivity(), "Connection timeout error", 
                    Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getActivity(), "An unknown error occurred.", 
                    Toast.LENGTH_SHORT).show();
        }
    }

答案 2 :(得分:0)

        public void onErrorResponse(VolleyError error) {
            String message=null;
            if(error instanceof NetworkError)
            {
                message = "Cannot connect to Internet...Please check your connection!";
                Toast.makeText(ScanQrCodeActivity.this, message, Toast.LENGTH_SHORT).show();
            }
            else if(error instanceof ServerError)
            {
                message = "The server could not be found. Please try again after some time!!";
                Toast.makeText(ScanQrCodeActivity.this, message, Toast.LENGTH_SHORT).show();
            }
            else if (error instanceof ParseError) {
                message = "Parsing error! Please try again after some time!!";
                Toast.makeText(ScanQrCodeActivity.this, message, Toast.LENGTH_SHORT).show();
            }

            swipeRefreshLayout.setRefreshing(false);
            HideSwipeDialog();

        }

最好的方式来显示Volley响应中的错误,但不要让直接的味精带给最终用户创造力,不要向味精显示类似“等待连接到服务器的瞬间”之类的信息