我正在Android 4.4.2上创建一个应用程序并使用ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar调用soap web服务并在响应中收到json。如果json的大小很小,那么app工作正常,但只要json的大小较大,代码就会产生java.io.IOException:BufferedInputStream关闭。请求帮助。
这是我的网络服务代码
public class SoapWebservice {
private static final String NAMESPACE = "http://schemas.xmlsoap.org/soap/encoding/";
private static final String URL = "http://staging.utzcertified.org/webservice.php?wsdl";
private static final String SOAP_ACTION = "AddServicePortType";
private static String return_string = "No response";
/**
* This method return Producer List from barcode & details in JSON string format.
* Scanner class invoke this method
* */
public static String returnProducersFromBarCode(DotNetWebService activity, int id,String barcode,String device,String language){
Log.i("Function Name","returnProducersFromBarCode");
Log.i("Parameters","Member ID:"+id+",Barcode:"+barcode+",Device:"+device+",Language:"+language);
String METHOD_NAME = "returnProducersFromBarCode";
SoapObject soapRequest = new SoapObject(NAMESPACE,"returnProducersFromBarCode");
soapRequest.addProperty("a", id);
soapRequest.addProperty("b", barcode);
soapRequest.addProperty("c", device);
soapRequest.addProperty("d", language);
SoapSerializationEnvelope soap_envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soap_envelope.setOutputSoapObject(soapRequest);
soap_envelope.encodingStyle = SoapEnvelope.ENC;
//HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, 2000000000);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;
SoapPrimitive soapResponse = null;
try {
System.setProperty("http.keepAlive", "false");
soap_envelope.setAddAdornments(false);
androidHttpTransport.call(SOAP_ACTION,soap_envelope);
Log.i("SoapWebServier-soap_envelope:",""+soap_envelope.getResponse());
soapResponse = (SoapPrimitive) soap_envelope.getResponse();
Log.i("SoapWebServier-soap_response:",""+soapResponse.toString());
}catch (XmlPullParserException e){
e.printStackTrace();
return null;
}catch (IOException e){
e.printStackTrace();
return null;
}
if(soapResponse != null){
return_string = soapResponse.toString();
}
return return_string;
}
}
我在异步任务的活动中调用它的方法
private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Log.i(TAG, "doInBackground");
int id = 106;
String barcode = "3456789012340";
String device = "Mobile";
String language = "en";
//Call Webservice class method and pass values and get response
String aResponse = SoapWebservice.returnProducersFromBarCode(DotNetWebService.this , id, barcode, device, language);
Log.i("AndroidExampleOutput", "----"+aResponse);
return null;
}
@Override
protected void onPostExecute(Void result) {
Log.i(TAG, "onPostExecute");
}
@Override
protected void onPreExecute() {
Log.i(TAG, "onPreExecute");
}
@Override
protected void onProgressUpdate(Void... values) {
Log.i(TAG, "onProgressUpdate");
}
}
编辑:LOGCAT
03-28 01:23:42.170: W/System.err(1237): java.io.IOException: BufferedInputStream is closed
03-28 01:23:42.180: W/System.err(1237):at java.io.BufferedInputStream.streamClosed(BufferedInputStream.java:118)
03-28 01:23:42.190: W/System.err(1237): at java.io.BufferedInputStream.read(BufferedInputStream.java:258)
03-28 01:23:42.190: W/System.err(1237): at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:200)
03-28 01:23:42.200: W/System.err(1237): at java.util.zip.GZIPInputStream.<init> (GZIPInputStream.java:98)
03-28 01:23:42.200: W/System.err(1237): at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
03-28 01:23:42.210: W/System.err(1237): at org.ksoap2.transport.HttpTransportSE.getUnZippedInputStream(HttpTransportSE.java:328)
03-28 01:23:42.210: W/System.err(1237): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:250)
03-28 01:23:42.220: W/System.err(1237): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
03-28 01:23:42.230: W/System.err(1237): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
03-28 01:23:42.230: W/System.err(1237): at com.classes.SoapWebservice.returnProducersFromBarCode(SoapWebservice.java:71)
03-28 01:23:42.240: W/System.err(1237): at com.example.soapattemptone.DotNetWebService$AsyncCallWS.doInBackground(DotNetWebService.java:60)
03-28 01:23:42.240: W/System.err(1237): at com.example.soapattemptone.DotNetWebService$AsyncCallWS.doInBackground(DotNetWebService.java:1)
03-28 01:23:42.250: W/System.err(1237): at android.os.AsyncTask$2.call(AsyncTask.java:288)
03-28 01:23:42.260: W/System.err(1237): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-28 01:23:42.270: W/System.err(1237): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-28 01:23:42.270: W/System.err(1237): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-28 01:23:42.270: W/System.err(1237): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-28 01:23:42.280: W/System.err(1237): at java.lang.Thread.run(Thread.java:841)
答案 0 :(得分:0)
就我而言,删除gzip编码解决了这个问题。 似乎gzip导致soap解析错误。