我对Android开发和使用排球有很新的想法并得到了一些问题。我试图通过Post发送一个JSONArray
并尝试取回一个字符串作为响应。
我已经通过github下载了凌空文件,并在工具箱中JsonArrayRequest.java
。这个文件包含了我完成任务所需的大量信息,因此我决定将其与StringRequest.java
混合使用,并得到以下信息:
名为SendingJsonArray.java的新类
package com.android.volley.toolbox;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import org.json.JSONArray;
import org.json.JSONException;
import java.io.UnsupportedEncodingException;
/**
* A request for retrieving a {@link JSONArray} response body at a given URL.
*/
public class SendingJsonArray extends JsonRequest<JSONArray> {
/**
* Creates a new request.
* @param url URL to fetch the JSON from
* @param listener Listener to receive the JSON response
* @param errorListener Error listener, or null to ignore errors.
*/
public SendingJsonArray(String url, JSONArray JsonArry, Listener<JSONArray> listener, ErrorListener errorListener) {
super(Method.POST, url, JsonArry, listener, errorListener);
}
@Override
protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString =
new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONArray(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
}
第一个奇怪的是SendingJsonArray()
不包含int方法?它编译并且似乎没有它。
我将Method.GET
更改为Method.POST
。它编译并且似乎再次起作用。
比我在"JSONArray JsonArry"
中添加了SendingJsonArray
并收到以下错误:
error: no suitable constructor found for JsonRequest(int,String,JSONArray,Listener<JSONArray>,ErrorListener)
[javac] super(Method.POST, url, JsonArry, listener, errorListener);
[javac] ^
[javac] constructor JsonRequest.JsonRequest(int,String,String,Listener<JSONArray>,ErrorListener) is not applicable
[javac] (actual argument JSONArray cannot be converted to String by method invocation conversion)
[javac] constructor JsonRequest.JsonRequest(String,String,Listener<JSONArray>,ErrorListener) is not applicable
[javac] (actual and formal argument lists differ in length)
[javac] 1 error
好的,我知道问题是什么,但我不知道如何解决这个问题。原始构造函数在哪里?如何修改我的构造函数?
如果我开始工作,将会有响应侦听器。我会尝试复制StringRequest.java
的监听器并希望这会有效吗?
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
为什么有两个,它们究竟是为什么创建的?对不起,但有关这方面的文档对我没有用处:/
感谢您的帮助! :)
答案 0 :(得分:1)
为了使用volley库发送JSONArray作为param我实现了这个名为JSONPostArrayRequest的类,它扩展了JSONRequest,也许它可以帮助你:
public class JsonPostArrayRequest extends JsonRequest<JSONObject> {
JSONArray params;
public JsonPostArrayRequest(String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener,JSONArray params) {
super(Method.POST, url, null, listener, errorListener);
this.params=params;
}
@Override
public byte[] getBody() {
if ( this.params != null && this.params.length() > 0) {
return encodeParameters( this.params, getParamsEncoding());
}
return null;
}
private byte[] encodeParameters(JSONArray params, String paramsEncoding) {
try {
return params.toString().getBytes(paramsEncoding);
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
}
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString =
new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
}