0

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

4

1 回答 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 回答