2016-09-19 2 views
-2

Я работаю над приложением, которое извлекает данные с устройства Bluetooth. Но иногда он выдает ошибку ООГО при выполнении некоторых операцийОшибка памяти: StringBuilder.append throwing OutOfMemoryError

Вот коду

следующим образом я хранящие данные в 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

И есть также эти два Callbacks для Android

  1. onLowMemory()
  2. onTrimMemory()

Но Я не уверен, как пойти на решение!

Катастрофа 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. 

Любая помощь приветствуется :)

+0

Это действительно линия 280? Покажите предыдущую строку. –

+0

Какой размер вашего списка данных, ИМО все зависит от этого? – home

ответ

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>();

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), ""); 
     } 
    } 
1

Сначала ваш цикл должен использовать

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

И ошибка указывает в другом направлении.

Смежные вопросы