2012-06-04 35 views
0

我正在使用kso​​ap2与.net web服务进行通信。但是,当我从图像提交一个字节数组时,我得到一个OutOfMemoryError。使用KSOAP2发送字节数组时发生java.lang.OutOfMemoryError

我使用下面的代码:

  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      new MarshalBase64().register(envelope); // serialization 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 
      HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS); 
      httpTransport.call(ADD_CLIENT_SOAP_ACTION, envelope);    
      Object response = null; 
      response = envelope.getResponse(); 

堆栈跟踪:

06-04 12:46:41.605: E/AndroidRuntime(9661): FATAL EXCEPTION: IntentService[SyncService] 
06-04 12:46:41.605: E/AndroidRuntime(9661): java.lang.OutOfMemoryError 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:216) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:164) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at java.io.OutputStreamWriter.convert(OutputStreamWriter.java:236) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at java.io.OutputStreamWriter.write(OutputStreamWriter.java:225) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at java.io.BufferedWriter.write(BufferedWriter.java:249) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.kxml2.io.KXmlSerializer.writeEscaped(KXmlSerializer.java:137) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.kxml2.io.KXmlSerializer.text(KXmlSerializer.java:544) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.serialization.MarshalBase64.writeInstance(MarshalBase64.java:40) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:656) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeProperty(SoapSerializationEnvelope.java:649) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:604) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:582) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:658) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:564) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:205) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.transport.Transport.createRequestData(Transport.java:111) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:120) 
06-04 12:46:41.605: E/AndroidRuntime(9661):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95) 
+0

你的字节数组有多大? – Codo

+0

它的一个形象,应该是大 – robasta

回答

0

一个“大”的形象,并在kSOAP2没有优化的组合可能是太多的内存有限的手机。

我估计kSOAP2暂时使用至少5倍的内存作为你想发送的字节数组的大小。除了字节数组本身之外,以及您可能会保留的其他图像副本。

所以为了让它工作,您需要在您的应用程序中找到其他可以减少内存消耗的区域。或者您需要找到一个不同的SOAP库,它不会保留完整的XML消息,也不会在内存中保存字节数组的Base 64编码字符串,但会使用流式方法对数组的小块进行编码,并直接通过网络连接。

+0

感谢突出'大',我改变(减少)的相机的分辨率设置,它的工作。图像太大了。 – robasta