2013-08-28 4 views
1

Мое приложение анализирует большой ответ http, ответ HTTP составляет более 6 мегабайт и является json, но не в стандартной схеме.android java недостаточно последовательной памяти для stringbuilder

 final char[] buffer = new char[0x10000]; 
     StringBuilder out = new StringBuilder(); 
     Reader in = new InputStreamReader(is, "UTF-8"); 
     int read; 
     System.gc(); 
     do 
     { 
      read = in.read(buffer, 0, buffer.length); 
      if (read > 0) 
      { 
       out.append(buffer, 0, read); 
      } 
     } while (read >= 0); 
     in.close(); 
     is.close(); 
     in = null; 
     is = null; 
     System.gc(); 
     return out.toString(); 

Это не имеет значения, если есть BufferedReader из файла, или InputStream, то StringBuilder просто не может содержать весь объект, и он терпит неудачу на out.append(buffer, 0, read); или потерпит неудачу в out.toString(), как другая копия может быть сделана

IOUtils.copy из библиотеки apache делает то же самое под капотом, и он также потерпит неудачу.

Как я могу прочитать этот большой объект для дальнейших манипуляций. В настоящий момент этот метод не работает на устройствах Android 2.2 и 2.3 и использует больше памяти, чем я, на более новых устройствах.

У похожих вопросов есть ответы, связанные с добавлением строкового редактора, чтением в строках или неполными решениями, которые являются только намеками, и это не работает.

ответ

4

Вам нужно сделать одну из двух вещей:

  1. Получить несколько небольших ответов JSON с сервера и анализировать их. Это может быть предпочтительным на мобильном устройстве, так как большие фрагменты данных могут не передаваться надежно, что заставит устройство повторно запрашивать всю вещь.
  2. Использование потокового JSON парсер, такие как Jackson, обрабатывать данные, как это происходит в.
+0

гм, что касается использования Джексона, это потребовало бы мне переписать весь мой метод HttpGet, который используется по всему приложению , А во-вторых, это означает, что для этого одного вызова api мне понадобится объект с объявленной каждой переменной? У него есть вложенные объекты тоже – CQM

+0

хорошо, что Джексон падает на том же месте на самом деле «java.lang.StringBuilder.toString (StringBuilder.java:663)», потому что он тоже использует встроенный построитель строк! hm – CQM

+0

Опубликовать свой код - вы используете потоковый API Jackson? – 323go

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