in meiner Anwendung habe ich über die beste Möglichkeit, 5xx Antworten vom Server zu implementieren denken.
Der erste Ansatz war meine eigene Version der Request.deliverError
Methode zu schreiben, wie angehängt:Volley Fehler Handhabung verallgemeinert
@Override
public void deliverError(VolleyError error) {
if(error.networkResponse == null){
super.deliverError(error);
return;
}else {
switch(error.networkResponse.statusCode){
case HttpStatus.SC_HTTP_VERSION_NOT_SUPPORTED:
AppInfo.reportDevInfo(GlideApplication.applicationContext, "got a 505 response for request" +this.toString(), null);
break;
case HttpStatus.SC_INTERNAL_SERVER_ERROR:
case HttpStatus.SC_BAD_GATEWAY:
case HttpStatus.SC_SERVICE_UNAVAILABLE:
case HttpStatus.SC_GATEWAY_TIMEOUT:
int retryCount = RETRY_COUNT - getRetryPolicy().getCurrentRetryCount();
if(retryCount < 0) {
super.deliverError(error);
return;
}
String backoff = error.networkResponse.getHeaders.get("Retry-After");
if(TextUtils.isEmpty(backoof) == false) {
attemptRetryWithNewBackoff(backoff);
return;
}
break;
}
super.deliverError(error)
}
}
}
aber, dass nur verursacht ANRs in der Anwendung.
auf die weitere Forschung Sehen, ich this blog post gefunden, die eine Art und Weise der Handhabung der verschiedenen Antwortcodes zeigte, das einzige Problem ist, dass ich nicht sicher bin, wie diese auf meine gesamte Anwendung zu verallgemeinern und Umsetzung Umgang mit 5xx Antwortcodes mit das entsprechende "Retry-After" heade.
eine Klasse zu haben, das ErrorListener
und bekommt im Konstruktor eines anderen als param implementiert scheint sehr kostspielig und ineffizient:
public class MyErrorListener implements ErrorListener {
ErrorListener mListener;
public MyErrorListener(ErrorListener listener) {
this.mListener = listener;
}
@Override
public void onErrorResponse(VolleyError error) {
if(handleFiveHundredResponse(error) == false) {
this.mListener.onErrorResponse(error);
}
}
}