如何捕捉Volley意外的响应错误

时间:2016-05-17 11:47:08

标签: java android android-volley

我正在使用Volley访问一些REST API。如果用户输入了错误的密码或其他任何错误,我想捕获异常。 E.g:

E/Volley: [281] BasicNetwork.performRequest: Unexpected response code 401

我可以以某种方式捕捉到这种说法吗?

这是LoginRequest:

public class LoginRequest  extends StringRequest{
    private static final String LOGIN_REQUEST_URL = "URL";
    public static final String CLIENT_KEY= "SECRET";
    public static final String CLIENT_ID = "ID";
    private Map<String, String> params;

    public LoginRequest(String username, String password, Response.Listener<String> listener) {
        super(Method.POST, LOGIN_REQUEST_URL, listener, null);
        params = new HashMap<>();
        params.put("username", username);
        params.put("password", password);
        params.put("client_secret", CLIENT_KEY);
        params.put("client_id", CLIENT_ID);
        params.put("grant_type", "password");
    }

    @Override
    public Map<String, String> getParams() {
        return params;
    }
}

解决方案:

我补充说:

public class LoginRequest  extends StringRequest{
    private static final String LOGIN_REQUEST_URL = "URL";
    public static final String CLIENT_KEY= "KEY";
    public static final String CLIENT_ID = "ID";
    private Map<String, String> params;

    public LoginRequest(String username, String password, Response.Listener<String> listener, **Response.ErrorListener errorListener**) {
        super(Method.POST, LOGIN_REQUEST_URL, listener, **errorListener**);
        params = new HashMap<>();
        params.put("username", username);
        params.put("password", password);
        params.put("client_secret", CLIENT_KEY);
        params.put("client_id", CLIENT_ID);
        params.put("grant_type", "password");
    }

    @Override
    public Map<String, String> getParams() {
        return params;
    }
}

并在我的LoginActiviy中添加了一个Resonse.ErrorListener,并使用附加参数调用了LoginRequest方法。

2 个答案:

答案 0 :(得分:2)

为了捕获齐射中的所有错误,onErrorResponse不够可靠,我有时在onErrorResponse中得到null。我更喜欢像这样覆盖 deliverError

 @Override
    public void deliverError(VolleyError error){
        Log.e("deliverError", " here");
       int status = error.networkResponse.statusCode;

        switch (status)
        {
            case 401:

                break;
            case 307:
                break;
            ...
            default:

        }
    }

答案 1 :(得分:1)

您可以创建一个自定义错误侦听器,它实现Volley的 Response.ErrorListener ,覆盖onErrorResponse()方法并获取响应代码。

编辑:

实际上您不需要创建自定义ErrorListener,因为默认的Volley的ErrorListener足以满足您的需求。

只需将Response.ErrorListener的一个实例传递给LoginRequest,并在onErrorResponse()方法中执行逻辑。