gpt4 book ai didi

android - 非常大的 SOAP 响应 - Android- 内存不足错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:03:04 30 4
gpt4 key购买 nike

我有一个应用程序,在它首次运行时,我需要通过对 Web 服务的 SOAP 调用将大量数据下载到应用程序中。然后将响应发送到转换 XML 并将数据存储在数据库文件中的函数。

数据超过 16MB,我每次都有 java.lang.OutOfMemoryError。

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

有什么办法可以下载大数据吗?也许像 InputStream 之类的东西?

这是我的代码

public Protocol[] getProtocols() {

String METHOD_NAME = "GetProtocols";
String SOAP_ACTION = "urn:protocolpedia#GetProtocols";
Log.d("service", "getProtocols");
SoapObject response = invokeMethod(METHOD_NAME, SOAP_ACTION);
return retrieveProtocolsFromSoap(response);
}

private SoapObject invokeMethod(String methodName, String soapAction) {
Log.d(TAG, "invokeMethod");
SoapObject request = GetSoapObject(methodName);
SoapSerializationEnvelope envelope = getEnvelope(request);
return makeCall(envelope, methodName, soapAction);

}

谁能建议在这种情况下应该做什么?

感谢和问候穆库尔

最佳答案

只是一个更新,我发现 AndroidHttpTransport 中的“call”方法在这一行内存不足 -

           if (debug) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[256];
while (true) {
int rd = is.read(buf, 0, 256);
if (rd == -1)
break;
bos.write(buf, 0, rd);
}
bos.flush();
buf = bos.toByteArray(); //Goes out of memory here
responseDump = new String(buf);
is.close();
is = new ByteArrayInputStream(buf);

调用 toByteArray 会占用大量内存,因此为了克服这个问题,我现在没有将响应转换为字节数组,而是直接将其写入 XML 文件,并将其保存在我选择的位置。这里 -

if (debug) {
FileOutputStream bos = new FileOutputStream("/data/data/com.mypackage.myapp/response.xml");
byte[] buf = new byte[1048576];
int current = 0; int i=0; int newCurrent = 0;
while ((current = inputStream.read(buf)) != -1) {
newCurrent = newCurrent + current;
Log.d("current", "Current = " + current + " total = "+newCurrent+" i = "+i++);
bos.write(buf, 0, current);
}
bos.flush();
}

设备不再耗尽内存,而且我有一个自定义解析方法,可以获取此 XML 并将其写入数据库。

关于android - 非常大的 SOAP 响应 - Android- 内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4941581/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com