【问题标题】:java.lang.OutOfMemoryError - Very large SOAP responsejava.lang.OutOfMemoryError - 非常大的 SOAP 响应
【发布时间】:2014-09-09 06:22:06
【问题描述】:

我有一个 android 应用程序,它调用 web 服务并以 xml 格式获取新闻!

解析大量新闻时它给了我一个 outOfMemoryError !

请问我该如何解决?!有什么帮助吗?!

这是我的 logcat 错误:

09-09 09:17:38.404: E/AndroidRuntime(31578): FATAL EXCEPTION: AsyncTask #4
09-09 09:17:38.404: E/AndroidRuntime(31578): java.lang.RuntimeException: An error occured while executing doInBackground()
09-09 09:17:38.404: E/AndroidRuntime(31578):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at java.lang.Thread.run(Thread.java:856)
09-09 09:17:38.404: E/AndroidRuntime(31578): Caused by: java.lang.OutOfMemoryError
09-09 09:17:38.404: E/AndroidRuntime(31578):    at java.lang.String.<init>(String.java:255)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at java.lang.String.<init>(String.java:171)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at java.lang.String.<init>(String.java:141)
09-09 09:17:38.404: E/AndroidRuntime(31578):    at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:190)

我从服务器获取数据的方法

if(categories.equals("") || categories.isEmpty() || categories == null)
            categories = "1;2;3;4;5;6;7;";
            getReportsObjZ.country = "0";
            getReportsObjZ.category = categories;
            getReportsObjZ.fdate = date_from;
            getReportsObjZ.tdate = date_to;

            try 
            {
                SharePoint_GetReportsByCatCntryResponse response = smartSearchSoap.SharePoint_GetReportsByCatCntry(getReportsObjZ);

                reportsXML = smartSearchSoap.getCountriesListFromService();
            }

            catch (Exception e) 
            {
                e.printStackTrace();
            }

            XMLParser parser = new XMLParser();

            Document doc = parser.getDomElement(reportsXML);

            NodeList nl = doc.getElementsByTagName(TAG_LIST);

            dbObject.open();


            dbObject.delete_ALL_ROWS();

            for (int i = 0; i < nl.getLength(); i++) 
            {
                Element e = (Element) nl.item(i);

                String just_date_without_time = getJustDATE(parser.getValue(e,TAG_CREATED_P));
                String just_time_without_date = getJustTIME(parser.getValue(e,TAG_CREATED_P));
                String numberical_category = "";



                dbObject.createEntry(parser.getValue(e, TAG_TITLE),
                        parser.getValue(e, TAG_COUNTRY_ID),
                        parser.getValue(e, TAG_DESCRIPTION),
                        parser.getValue(e, TAG_IDP),
                        removeSpecialChars(parser.getValue(e, TAG_CATEGORYP)),
                        just_date_without_time, just_time_without_date,
                        parser.getValue(e, TAG_CREATED_BY),
                        parser.getValue(e, TAG_TAGS),
                        parser.getValue(e, TAG_READ_BY),
                        removeSpecialChars(parser.getValue(e, TAG_CITY)),
                        (parser.getValue(e, TAG_DIR)),
                        removeSpecialChars(parser.getValue(e, TAG_LINK)),numberical_category);
            }

            dbObject.close();

【问题讨论】:

标签: android xml-parsing out-of-memory ksoap


【解决方案1】:

android有堆限制,从你的文件中分块读取XML数据并方便解析

尝试将android:largeHeap="true" 放在清单文件的应用程序标记中。

【讨论】:

  • 那么,android有堆限制,从你的文件中分块读取XML数据并方便解析
  • 好的,如何在不更改网络服务的情况下做到这一点?我可以在我的 Android 应用中这样做吗?!
  • 是的,你可以在你的应用中做,首先从你的文件中解析一些数据并将其存储在某个地方,然后再次解析剩余的数据块
  • 这里你的循环执行到 nl.getLength() 而不是你可以执行它 nl.getLength()/2 (执行 nl.getLength() 的一半)
猜你喜欢
  • 1970-01-01
  • 2014-10-30
  • 2015-03-11
  • 2012-05-07
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
相关资源
最近更新 更多