问题
I am using volley library for network calls.For one such call,I am getting :
com.android.volley.NoConnectionError: java.io.EOFException
Below is my code:
public void loadSearchList(final String mName){
String url;
int mainval;
if(product.getMain()==1){
mainval=2;
}
else{
mainval=1;
}
url=Constants.productListUrlStr+"?"+"_supplier"+"="+globalProvider.contract._supplier+"&"+"main"+"="+mainval+"&"+"name"+"="+mName;
Map<String,String> params=new HashMap<>();
params.put("_supplier",globalProvider.contract._supplier);
params.put("name",mName);
params.put("main",String.valueOf(mainval));
Log.d("checksearchurl",url);
Utf8JsonRequest utf8JsonRequest=new Utf8JsonRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("checkresponse",response);
parseSearchList(response,mName);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("checeee",error.toString());
}
}
)
{
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", Constants.getToken(ProductDetailActivity.this));
headers.put("language","english");
// headers=globalProvider.addHeaderToken(ProductDetailActivity.this);
// Log.d("checklangheader",headers.get("Language"));
//headers=globalProvider.addHeaderToken(getActivity());
return headers;
}
@Override
public Request.Priority getPriority() {
Request.Priority mPriority = Request.Priority.HIGH;
return mPriority;
}
};
globalProvider.addRequest(utf8JsonRequest);
}
This is my Utf8JsonRequest:
public class Utf8JsonRequest extends StringRequest {
private Priority priority;
private Response.Listener<String> listener;
public Utf8JsonRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
super(method, url,listener, errorListener);
this.listener=listener;
}
public Utf8JsonRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
super(url, listener, errorListener);
this.listener=listener;
}
@Override
protected Response<String> parseNetworkResponse (NetworkResponse response) {
try {
String utf8String = new String(response.data, "UTF-8");
return Response.success(new String(utf8String), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
// log error
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(String response) {
// TODO Auto-generated method stub
listener.onResponse(response);
}
public void setPriority(Priority priority) {
this.priority = priority;
}
@Override
public Priority getPriority() {
return priority;
}
}
I have to construct url like:
this:url=Constants.productListUrlStr+"?"+"_supplier"+"="+
globalProvider.contract._supplier+"&"+"main"+"="+mainval+"&"+"name"+"="+mName
If I pass params than I get code 400 error.
I am repenting my decision of choosing volley over retrofit.
回答1:
After struggling for few hours, found the issue. Issue was with url.If I wanted to search "purple sweet potato",it was throwing the above error. So I constructed my url like this:
url=Constants.productListUrlStr+"?"+"_supplier"+"="+ globalProvider.contract._supplier+"&"+"main"+"="+mainval+"&"+"name"+"="+mName
String requestURL = String.format(url+"&"+"name=%s", Uri.encode(mName)); And now it works fine.
来源:https://stackoverflow.com/questions/49143868/com-android-volley-noconnectionerror-java-io-eofexception