内存不足错误:StringBuilder.append抛出OutOfMemoryError

时间:2016-09-19 10:13:01

标签: java android

我正在处理从蓝牙设备获取数据的应用程序。但有时它会在执行某些操作时抛出 OOM错误

这是代码

以下方式我将数据存储在ArrayList<String>

private ArrayList<String> dataList; 
if (response.compareTo("Some Filter") != 0 //response is of String type
{
    dataList.add(response);
}

在下面的for each循环中,它会抛出OOM错误

for (String s : dataList) { 
if(s.length()>8)
    dataList.set(dataList.indexOf(s), s.substring(8));  
else
    dataList.set(dataList.indexOf(s), "");
}

String downloadedData = "";
for (String s : dataList) {
    downloadedData += s; //This one is the 280th line throwing OOM
}

到目前为止,我已阅读this帖子,但它提供了在json或网络响应中读取数据的解决方案

And i know OOM error can't be handled but prevented by following a good Architecture

此外还有这两款针对Android的回调

  1. onLowMemory()
  2. onTrimMemory()
  3. 但我不确定如何解决问题!!

    崩溃Stacktrace是:

    java.lang.OutOfMemoryError: Failed to allocate a 106990 byte allocation with 5840 free bytes and 5KB until OOM
     at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
     java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:146)
     at java.lang.StringBuilder.append(StringBuilder.java:216) 
     at Class_name.java:280.
    

    感谢任何帮助:)

3 个答案:

答案 0 :(得分:1)

首先:if (response.compareTo("Some Filter") != 0 )这很奇怪,你可以使用equals方法。

然后你要添加对列表的响应,然后你减少列表中所有响应的长度,如果它们高于8(同样,你做了substring(8),它修剪了前8​​个字母,我认为你想保留前8个字母并删除其余字母,如果是,那么执行substring(0, 8))。

我的回答是:当你将它添加到列表中时,为什么不在for-each中处理你正在做的事情?它会更容易,性能更好,可能会修复你的错误。

此外,我不确定您是否正在初始化您的列表,也许您只是忘了粘贴它(您拥有的只是private ArrayList<String> dataList;),但这就是您如何制作新列表:

List<String> list = new ArrayList<String>();

答案 1 :(得分:1)

首先你的循环应该使用

for (int i = 0; i < dataList.size(); ++i) {
    String s = dataList.get(i);
    dataList.set(i, s.length() > 8 ? s.substring(8) : "");  
}

错误指向另一个方向。

答案 2 :(得分:0)

尝试它正在运作

 ArrayList<String> dataList = new ArrayList<>();
 String response = "CVMKVLC";
    if (response.compareTo("Some Filter") != 0 ) {
         //response is of String type     
         dataList.add(response);
    }

    for (String s : dataList) { //This line throws OOM
       if(s.length()>8)
           dataList.set(dataList.indexOf(s), s.substring(8));
       else
           dataList.set(dataList.indexOf(s), "");
       }
    }