项目中使用 Volley 作为网络库,封装过程中遇到几个常见问题,记录如下。以下内容不兼容 Android 2.3 及以下版本。
添加请求参数#
重写 getParams 方法即可:
1
2
3
4
| @Override
protected Map<String, String> getParams() {
return mParams;
}
|
使用 Cookie#
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));
|