20170906工作日记--volley源码的相关方法细节学习
1. 在StringRequest类中的75行--new String();使用方法
1 /** 2 * 工作线程将会调用这个方法 3 * @param response Response from the network 4 * @return 5 */ 6 @Override 7 protected Response<String> parseNetworkResponse(NetworkResponse response) { 8 String parsed; 9 try { 10 parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 11 } catch (UnsupportedEncodingException e) {//如果指定字符集不受支持 12 parsed = new String(response.data); 13 } 14 return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); 15 }
关于HttpHeaderParser.parseCharaset()方法:
1 /** 2 * Retrieve a charset from headers 3 * 4 * @param headers An {@link java.util.Map} of headers 5 * @param defaultCharset Charset to return if none can be found 6 * @return Returns the charset specified in the Content-Type of this header, 7 * or the defaultCharset if none can be found. 8 */ 9 public static String parseCharset(Map<String, String> headers, String defaultCharset) { 10 String contentType = headers.get(HTTP.CONTENT_TYPE); 11 if (contentType != null) { 12 String[] params = contentType.split(";"); 13 for (int i = 1; i < params.length; i++) { 14 String[] pair = params[i].trim().split("="); 15 if (pair.length == 2) { 16 if (pair[0].equals("charset")) { 17 return pair[1]; 18 } 19 } 20 } 21 } 22 23 return defaultCharset; 24 } 25 26 /**从请求消息头中获取编码字符集,并且返回 27 * Returns the charset specified in the Content-Type of this header, 28 * or the HTTP default (ISO-8859-1) if none can be found. 29 */ 30 public static String parseCharset(Map<String, String> headers) { 31 return parseCharset(headers, HTTP.DEFAULT_CONTENT_CHARSET); 32 }
(1)需要了解到HTTP协议中HTTP.CONTENT_TYPE参数以及HTTP协议的消息头信息:
可以看到Content-type的消息格式为application/json;chaset=UTF-8 的格式
(2)new String(byte[],"UTF-8")是新建了一个UTF-8编码的字符串
字符串内容不变,只是依照后面的字符集创建新的字符串,其中解决中文乱码问题可以使用GBK字符编码。
同时它将抛出:UnsupportedEncodingException
- 如果指定字符集不受支持