SOAP – 非常大的XML响应 – OutOfMemoryError

首先,这个问题看起来像 非常大的SOAP响应 – Android-内存不足错误 主题。 由于我的英语弱点和这个问题的相似性,为了便于理解,一些陈述段落被复制了。

我有一个应用程序,我需要通过SOAP调用下载大量数据到Web服务。 然后将响应发送到显示XML文件的函数。

数据大小超过11MB,每次都有一个java.lang.OutOfMemoryError

修改Web服务以提供较少量的数据不是一种选择。

我使用“Http请求”来获取数据。 我知道:我的resquest很好,soapUi和wireshark返回预期的回复。

但是我的AVD无法通过这条线

HttpResponse httpResponse = httpClient.execute(httpPost);

经过几分钟的工作(在此期间,wireshark恢复了一些预期的查询),就会出现这个错误

  Out of memory on a 16705124-byte allocation. 

我试图将SD卡大小升级到20GB,但仍然是错误。

解析httpResponse可能是下一步,是否可以解析HttpResponse,同时通过exmple将其分成几个部分来接收数据?

你有好主意吗 ?

谢谢,Dsandre

感谢Graeme,打开连接作为字节流工作。 如果它对某人有帮助,这是我的源代码

  //Make a temporary file to save data File responseFile = File.createTempFile("SOAP", "xml", context.getFilesDir()); int nbCharRead = 0; int i=0; int totalRead = 0; //Send query OutputStream outputS = url_Connection.getOutputStream(); Writer w_out = new OutputStreamWriter(outputS); w_out.write(webServiceXml); w_out.flush(); w_out.close(); //Buffers BufferedReader bufReader = new BufferedReader(new InputStreamReader(url_Connection.getInputStream())); BufferedWriter bufWriter = new BufferedWriter(new FileWriter(responseFile)); char[] buffer = new char[10000]; while((nbCharRead = bufReader.read(buffer, 0, 10000)) != -1) { totalRead += nbCharRead; Log.d("Test InputStream", "i: " + i++ +" - " + nbCharRead + " -> " + totalRead); bufWriter.write(buffer, 0, nbCharRead ); } if(bufWriter != null) { bufWriter.flush(); bufWriter.close(); } Log.w(MsgLog, "--- Stream Got--- ; Total : " + totalRead); 

您可以作为字节流打开连接:

 URL url = new URL("www.google.com"); InputStream in = new BufferedInputStream(url.openStream()); byte[] buffer = new byte[1024]; int chunk = 0; while ((chunk =in.read(buffer ))!=-1) { proccessChunk(chunk); } in.close(); 

从这一点开始,您应该能够对响应进行计量并逐位处理,将每个已处理的块保存为文本文件(或者,如果它是与SQLite的关系数据)。

HTH

您可能正在将整个响应加载到内存中(可能是一个字符串?)。 Android设备,尤其是在较旧的硬件和旧版本的操作系统上运行的旧设备,具有有限的vm堆大小。 我不记得确切的数字,但快速谷歌表明它低至16mb。

处理Android设备中响应大的响应的最佳方法是将其作为流读取。 我认为最新版本的apache-commons / jakarta httpclient支持流媒体。