Điều đầu tiên bạn cần là sửa đổi phương thức BasicNetwork.convertHeaders để làm cho nó hỗ trợ nhiều giá trị bản đồ. Dưới đây là ví dụ về phương pháp chỉnh sửa:
protected static Map<String, List<String>> convertHeaders(Header[] headers) {
Map<String, List<String>> result = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
for (int i = 0; i < headers.length; i++) {
Header header = headers[i];
List<String> list = result.get(header.getName());
if (list == null) {
list = new ArrayList<String>(1);
list.add(header.getValue());
result.put(header.getName(), list);
}
else list.add(header.getValue());
}
return result;
}
Sau đó bạn cần là để sửa đổi DiskBasedCache.writeStringStringMap và DiskBasedCache.readStringStringMap phương pháp. Họ nên hỗ trợ nhiều giá trị. Dưới đây là sửa đổi phương pháp đó cùng với các phương pháp helper:
static void writeStringStringMap(Map<String, List<String>> map, OutputStream os) throws IOException {
if (map != null) {
writeInt(os, map.size());
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
writeString(os, entry.getKey());
writeString(os, joinStringsList(entry.getValue()));
}
} else {
writeInt(os, 0);
}
}
static Map<String, List<String>> readStringStringMap(InputStream is) throws IOException {
int size = readInt(is);
Map<String, List<String>> result = (size == 0)
? Collections.<String, List<String>>emptyMap()
: new HashMap<String, List<String>>(size);
for (int i = 0; i < size; i++) {
String key = readString(is).intern();
String value = readString(is).intern();
result.put(key, parseNullStringsList(value));
}
return result;
}
static List<String> parseNullStringsList(String str) {
String[] strs = str.split("\0");
return Arrays.asList(strs);
}
static String joinStringsList(List<String> list) {
StringBuilder ret = new StringBuilder();
boolean first = true;
for (String str : list) {
if (first) first = false;
else ret.append("\0");
ret.append(str);
}
return ret.toString();
}
Và điều cuối cùng là HttpHeaderParser lớp. Bạn nên thực hiện phương thức parseCacheHeaders hỗ trợ nhiều giá trị. Sử dụng các phương pháp sau đây helper cho việc này:
public static String getHeaderValue(List<String> list) {
if ((list == null) || list.isEmpty()) return null;
return list.get(0);
}
Và điều mới nhất để thay đổi là một loạt các nơi để thay thế
Map<String, String>
để
Map<String, List<String>>
sử dụng IDE của bạn để làm điều này.
Nguồn
2015-03-11 10:33:58
Chỉ cần chú ý đến điều này, điều này thật lố bịch từ Google. Rõ ràng thư viện này là dành cho những thứ rất nhẹ. – georgiecasey
Đó không phải là vấn đề với Android Volley. Đó là một vấn đề của các máy chủ web. Set-Cookie không được nhiều. http://stackoverflow.com/questions/11533867/set-cookie-header-with-multiple-cookies –
http://stackoverflow.com/a/25388897/2819864 là giải pháp nhanh nhất – RominaV