我在android中使用SOAP Parsing。在我的应用程序中,有一点我必须下载大量数据,其中字节数组类型的数据也在那里。
对于解决方案,我已经引用了链接Very large SOAP response - Android- out of memory error,但无法了解它如何与我的soap对象一起使用。
我用来获取soap响应的方法如下:
public SoapObject taskDetail() {
SoapObject result = null;
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("ID", "4");
request.addProperty("fromDate", "02/06/2013");
request.addProperty("toDate", "02/06/2013");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
AndroidHttpTransport transport = new AndroidHttpTransport(URL);
transport.debug = true;
try {
transport.call(SOAP_ACTION, envelope);
result = (SoapObject)envelope.getResponse();
for(int i=0; i<result.getPropertyCount(); i++) {
SoapObject view_task_master = (SoapObject) result.getProperty(i);
screen = view_task_master.getProperty("Screen").toString();
Log.i("screen",screen);
date = view_task_master.getProperty("Createddate").toString();
Log.i("date",date);
}
}
catch (IOException e) {
Log.i("IOException",e.getMessage());
}
catch (XmlPullParserException e) {
Log.i("XMLPullParserException",e.getMessage());
}
return result;
}
我知道主要问题是因为大数据导致结果对象无法处理它 请帮忙...提前致谢... !!
答案 0 :(得分:2)
两种帮助您解决此问题的策略:
在下载时将SOAP XML流直接保存到磁盘。不要将其存储在内存中。 使用SAX样式的解析器解析它,您不会将整个DOM加载到内存中,而是将其解析为块。 根据您处理的XML类型,使用SAX解析器通常在代码中更难;你必须自己跟踪很多事情,否则你将无法从你的DOM树的一个部分“跳转”。但内存消耗会低一些。
但请注意,许多“高级”网络通信库通常会将整个XML DOM加载到内存中,这可能就是这种情况。您可能必须自己创建和管理HTTP连接,然后手动解析结果。
答案 1 :(得分:0)
使用ContentHandler。当找到包含数据的标记时,使用characters()方法从输入流中获取字符数组并将其写入文件或数据库。这样您就不需要将所有数据都保存在ram中。 (这是针对soap对象包含BLOB的情况的解决方案)
另请注意,AsyncTask不是执行长时间运行的网络请求的最佳方式(如果使用execute()启动,则只有一个AsyncTask可以在3.0+上运行)