</pre><pre code_snippet_id="1586756" snippet_file_name="blog_20160224_2_4887381" name="code" class="java"><span style="font-size:18px;">对返回的json字符串根据对象或数组标记进行Gson解析;</span>
package com.android.volley.toolbox;
import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.Request.ResponseListener;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.FileProgressListener;
import com.android.volley.toolbox.FormFile;
import com.android.volley.toolbox.HttpHeaderParser;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class MultipartRequest extends Request<String> {
private final ResponseListener mListener;//服务器响应的数据回调
private final FileProgressListener mProgressListener;文件上传进度回调
private Map<String, String> headerMap;
private Map<String, String> mParams;//上传的参数
private FormFile[] files;//上传的文件参数
private String BOUNDARY;
private boolean object;//返回的具体数据是否为对象
private Class mClass;//对象字节码类型
public MultipartRequest(String url, ResponseListener listener, ErrorListener errorListener, Map<String, String> params, FormFile[] files, Class clazz, boolean object) {
this(1, url, listener, errorListener, (FileProgressListener)null, params, files, clazz, object);
}
public MultipartRequest(String url, ResponseListener listener, ErrorListener errorListener, FileProgressListener progressListener, Map<String, String> params, FormFile[] files, Class clazz, boolean object) {
this(1, url, listener, errorListener, progressListener, params, files, clazz, object);
}
public MultipartRequest(int method, String url, ResponseListener listener, ErrorListener errorListener, FileProgressListener progressListener, Map<String, String> params, FormFile[] files, Class clazz, boolean object) {
super(method, url, errorListener);
this.BOUNDARY = "---------7dc05dba8f3e19";
this.mListener = listener;
this.mProgressListener = progressListener;
this.mParams = params;
this.files = files;
this.mClass = clazz;
this.object = object;
this.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1.0F));
}
public String getBodyContentType() {
return "multipart/form-data; boundary=" + this.BOUNDARY;
}
public byte[] getBody() throws AuthFailureError {
if(this.getParams() != null) {
return super.getBody();
} else {
StringBuilder sb = new StringBuilder();
Iterator var3 = this.mParams.entrySet().iterator();
while(var3.hasNext()) {
Entry e = (Entry)var3.next();
sb.append("--");
sb.append(this.BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data; name=\"" + (String)e.getKey() + "\"\r\n\r\n");
sb.append((String)e.getValue());
sb.append("\r\n");
}
try {
return sb.toString().getBytes("utf-8");
} catch (UnsupportedEncodingException var4) {
var4.printStackTrace();
return null;
}
}
}
public void writeFile(OutputStream out) {
DataOutputStream dos = (DataOutputStream)out;
try {
if(this.files != null) {
FormFile[] var6 = this.files;
int var5 = this.files.length;
for(int e1 = 0; e1 < var5; ++e1) {
FormFile e = var6[e1];
StringBuilder split = new StringBuilder();
split.append("--");
split.append(this.BOUNDARY);
split.append("\r\n");
split.append("Content-Disposition: form-data;name=\"" + e.getParameterName() + "\";filename=\"" + e.getFileName() + "\"\r\n");
split.append("Content-Type: " + e.getContentType() + "\r\n\r\n");
dos.write(split.toString().getBytes());
if(e.getInputStream() == null) {
dos.write(e.getBytes(), 0, e.getBytes().length);
} else {
byte[] buffer = new byte[1024];
boolean len = true;
int count = 0;
int var13;
while((var13 = e.getInputStream().read(buffer)) != -1) {
dos.write(buffer, 0, var13);
count += var13;
if(this.mProgressListener != null) {
this.mProgressListener.onProgressChange(e.getFileSize(), count);
}
}
boolean var14 = false;
e.getInputStream().close();
}
dos.write("\r\n".getBytes());
}
}
dos.write(("--" + this.BOUNDARY + "--\r\n").getBytes("utf-8"));
dos.flush();
} catch (Exception var12) {
this.deliverError(new VolleyError(var12.toString()));
try {
dos.close();
} catch (IOException var11) {
var11.printStackTrace();
}
}
}
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException var4) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
protected void deliverResponse(String response) {
this.mListener.onResponse(response, this.mClass, this.object);
}
}