我实现了一个带有排球库的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而不包含信息(代码错误)。
我该如何解决这个问题?
答案 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响应中的错误,但不要让直接的味精带给最终用户创造力,不要向味精显示类似“等待连接到服务器的瞬间”之类的信息