ResponseDelivery实现

时间:2013-09-03 15:03:25

标签: android-volley

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

1 个答案:

答案 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()

中处理