我想实现一个通用的错误处理程序来处理特定状态代码的错误。我希望放入队列的每个请求都具有相同的行为。一种情况是 401。当收到 401 状态时,我想显示一个登录对话框,然后重播原始请求,而启动该请求的活动不必知道任何有关它的信息。我正在考虑实现与 ExecutorDelivery 几乎相同的自定义 ResponseDelivery。但是,当我这样做时,我发现 Request.finish 方法是包私有的。有没有更好的方法来用凌空来实现这种行为?谢谢
问问题
210 次
1 回答
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()
于 2013-10-19T21:22:57.090 回答