Android 排球中的 JsonRequest VS StringRequest
JsonRequest VS StringRequest in Android Volley
我正在使用 Android Volley 进行网络通话。通常我使用 JSONRequest 接收 json 数据,然后使用 GSON 将它们转换为对象。
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
///Convert response.toString() to POJO using GSON
}
};
如果我使用纯字符串请求,然后使用 GSON 将字符串转换为对象,这会比 JSONRequest 更快吗?
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
///Convert response to POJO using GSON
}
};
谢谢
使用 StringRequest
会更有效,因为返回的原始数据是字符串格式,JSONRequest
将字符串转换为 JSONObject
,这对您的情况来说不是必需的。
实际上你可以实现自己的GSONRequest
,你可以google GSON volley
作为许多参考。
举个例子:
making a GSON request using volley
正如我所说,对于 POJO class,您可以像下面的代码一样创建一个自定义请求,因为如果您使用 StringRequest,您必须做很多工作。
在这里,我的 POJO class 是 FileInfo,例如。
public class FileRequest extends Request<FileInfo> {
private final String mRequestBody;
private final Response.Listener<FileInfo> mListener;
private final Response.ErrorListener mErrorListener;
private static final String PROTOCOL_CHARSET = "utf-8";
private static final String PROTOCOL_CONTENT_TYPE = String.format("application/json; charset=%s", PROTOCOL_CHARSET);
public FileRequest(int method, String url, Response.Listener<FileInfo> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mRequestBody = null;
this.mListener = listener;
this.mErrorListener = errorListener;
}
public FileRequest(String url, String requestBody, Response.Listener<FileInfo> listener, Response.ErrorListener errorListener) {
super(requestBody == null ? Method.GET : Method.POST, url, errorListener);
this.mRequestBody = requestBody;
this.mListener = listener;
this.mErrorListener = errorListener;
}
public FileRequest(int method, String url, String requestBody, Response.Listener<FileInfo> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mRequestBody = requestBody;
this.mListener = listener;
this.mErrorListener = errorListener;
}
@Override
protected Response<FileInfo> parseNetworkResponse(NetworkResponse response) {
try {
FileInfo fileInfo = new FileInfo();
fileInfo.Size = Long.valueOf(response.headers.get("Content-Length"));
fileInfo.Type = response.headers.get("Content-Type");
fileInfo.Modified = response.headers.get("Last-Modified");
fileInfo.Data = response.data;
return Response.success(fileInfo, HttpHeaderParser.parseCacheHeaders(response));
} catch (Exception e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(FileInfo response) {
mListener.onResponse(response);
}
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
return super.parseNetworkError(volleyError);
}
@Override
public void deliverError(VolleyError error) {
mErrorListener.onErrorResponse(error);
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
public byte[] getBody() throws AuthFailureError {
try {
return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
mRequestBody, PROTOCOL_CHARSET);
return null;
}
}
}
希望对您有所帮助!
我正在使用 Android Volley 进行网络通话。通常我使用 JSONRequest 接收 json 数据,然后使用 GSON 将它们转换为对象。
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
///Convert response.toString() to POJO using GSON
}
};
如果我使用纯字符串请求,然后使用 GSON 将字符串转换为对象,这会比 JSONRequest 更快吗?
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
///Convert response to POJO using GSON
}
};
谢谢
使用 StringRequest
会更有效,因为返回的原始数据是字符串格式,JSONRequest
将字符串转换为 JSONObject
,这对您的情况来说不是必需的。
实际上你可以实现自己的GSONRequest
,你可以google GSON volley
作为许多参考。
举个例子: making a GSON request using volley
正如我所说,对于 POJO class,您可以像下面的代码一样创建一个自定义请求,因为如果您使用 StringRequest,您必须做很多工作。
在这里,我的 POJO class 是 FileInfo,例如。
public class FileRequest extends Request<FileInfo> {
private final String mRequestBody;
private final Response.Listener<FileInfo> mListener;
private final Response.ErrorListener mErrorListener;
private static final String PROTOCOL_CHARSET = "utf-8";
private static final String PROTOCOL_CONTENT_TYPE = String.format("application/json; charset=%s", PROTOCOL_CHARSET);
public FileRequest(int method, String url, Response.Listener<FileInfo> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mRequestBody = null;
this.mListener = listener;
this.mErrorListener = errorListener;
}
public FileRequest(String url, String requestBody, Response.Listener<FileInfo> listener, Response.ErrorListener errorListener) {
super(requestBody == null ? Method.GET : Method.POST, url, errorListener);
this.mRequestBody = requestBody;
this.mListener = listener;
this.mErrorListener = errorListener;
}
public FileRequest(int method, String url, String requestBody, Response.Listener<FileInfo> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mRequestBody = requestBody;
this.mListener = listener;
this.mErrorListener = errorListener;
}
@Override
protected Response<FileInfo> parseNetworkResponse(NetworkResponse response) {
try {
FileInfo fileInfo = new FileInfo();
fileInfo.Size = Long.valueOf(response.headers.get("Content-Length"));
fileInfo.Type = response.headers.get("Content-Type");
fileInfo.Modified = response.headers.get("Last-Modified");
fileInfo.Data = response.data;
return Response.success(fileInfo, HttpHeaderParser.parseCacheHeaders(response));
} catch (Exception e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(FileInfo response) {
mListener.onResponse(response);
}
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
return super.parseNetworkError(volleyError);
}
@Override
public void deliverError(VolleyError error) {
mErrorListener.onErrorResponse(error);
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
public byte[] getBody() throws AuthFailureError {
try {
return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
mRequestBody, PROTOCOL_CHARSET);
return null;
}
}
}
希望对您有所帮助!