我想实现一个常见的错误处理程序,它将处理特定状态代码的错误。我希望队列中的每个请求都具有相同的行为。一个场景是401.当收到401状态时,我想显示一个登录对话框,然后重播原始请求,而没有启动该请求的活动必须知道任何相关信息。 我正在考虑实现一个与ExecutorDelivery几乎完全相同的自定义ResponseDelivery。但是,当我这样做时,我发现Request.finish方法是包私有的。是否有更好的方法来实现这种排球的行为?感谢
答案 0 :(得分:0)
我将从以下开始:
public abstract class BaseRequest<T extends ErrorResponse> extends Request<T> {
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
jsonString = new String(response.data);
T parsedResponse = null;
try {
parsedResponse = parseJson(jsonString);
// this is where you can handle any type of common errors from server
if (parsedResponse != null && parsedResponse.getErrorCode() == 401) {
return Response.error(new SessionExpiredError(parsedResponse.getErrorMessage()));
}
} catch (JsonSyntaxException e) {
Ln.e(e, "JsonSyntaxException");
Ln.e(jsonString);
return Response.error(new VolleyError(e));
}
return Response.success(parsedResponse, HttpHeaderParser.parseCacheHeaders(response));
}
}
public class ErrorStatusResponse {
private int errorCode;
private String errorMessage;
...
}
将根据您在交付结果之前指定的错误检查扩展BaseRequest的所有请求。
继续,您无法在没有上下文的情况下启动任何活动或显示对话框(并且您不希望将Context
传递给ResponseDelivery。因此您可以为此目的创建BaseActivity:
public abstract class BaseActionBarActivity
extends ActionBarActivity
implements Response.ErrorListener {
@Override
public void onErrorResponse(VolleyError error) {
// if your ChildActivitiy wants to override this method, make sure to call super.onErrorResponse
if (error instanceof NoConnectionError) {
noConnection();
} else if (error instanceof SessionExpiredError) {
sessionExpired(); // startForResult some LoginActivity here
} else {
Ln.e(error);
}
}
}
为了再次触发上一个请求,我会像这样做:
// ChildActivity
public void fireRequest() {
api.getMyItemsFromServer();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SUBACTIVITY_SESSION_EXPIRED) {
api.getMyItemsFromServer();
}
}
或者您可以在BaseActivity
中保存上次失败的请求,并在其onActivityResult()