java.io.IOException:调用soap webservice时,BufferedInputStream关闭,生成的json太长

时间:2014-03-27 10:44:51

标签: android android-ksoap2

我正在Android 4.4.2上创建一个应用程序并使用kso​​ap2-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)

1 个答案:

答案 0 :(得分:0)

就我而言,删除gzip编码解决了这个问题。 似乎gzip导致soap解析错误。

How to request a gzipped / compressed SOAP response?

相关问题