项目中使用 Volley 作为网络库,封装过程中遇到几个常见问题,记录如下。以下内容不兼容 Android 2.3 及以下版本。

添加请求参数

重写 getParams 方法即可:

1
2
3
4
@Override
protected Map<String, String> getParams() {
    return mParams;
}

HttpURLConnection 原生支持 Cookie 管理,通过 CookieHandler 设置:

1
2
CookieHandler.setDefault(new CookieManager());
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));

请求时通过 Header 携带 Cookie,响应时解析 set-cookie 头。详见 HttpURLConnection 文档。

Cache.Entry 空指针异常

1
2
3
Attempt to read from field com.android.volley.Cache$Entry
com.android.volley.Response.cacheEntry on a null object reference
    at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:126)

原因:重写 parseNetworkResponse 时,第二个参数传入了 null,导致 NetworkDispatcher 读缓存时抛出 NPE。

修复:返回有效的缓存头信息。

1
2
3
4
5
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
    // ...
    return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}

statusCode 空指针异常

1
int statusCode = statusLine.getStatusCode(); // NullPointerException

Request 构造参数(如 listener)为 null 时可能触发。请确保必要参数非空。

设置超时时间

1
2
3
4
myRequest.setRetryPolicy(new DefaultRetryPolicy(
    MY_SOCKET_TIMEOUT_MS,
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

参考