2013-12-11 1 views
0

Я работаю над http получить запрос на Android.Ошибка OutOfMemory в ArrayList. Android

Я получаю огромное количество данных json от сервера, строка не может обрабатывать или хранить эти данные и получать OutOfMemory Exception.

Затем я попытался сохранить его в arrayList, который может хранить максимум Integer.Maximum value. , но он получает исключение OutOfMemory при хранении в месте нахождения ~ 8970.

Вот моя ссылка, в которой есть данные json.

http://ec2-50-19-105-251.compute-1.amazonaws.com/ad/Upload/getitemlist10122013035042.txt

вот мой код:

ArrayList<String> newarr = new ArrayList<String>(); 
    try { 

     URL url = new URL(urlFilePath); 
     HttpURLConnection urlConnection = (HttpURLConnection) url 
       .openConnection(); 

     urlConnection.setRequestMethod("GET"); 
     // urlConnection.setDoOutput(true); 

     // connect 
     urlConnection.connect(); 

     // Stream used for reading the data from the internet 
     InputStream inputStream = urlConnection.getInputStream(); 

     // create a buffer... 
     byte[] buffer = new byte[1024]; 
     int bufferLength = 0; 
     int check; 
     while ((bufferLength = inputStream.read(buffer)) > 0) { 
      String decoded = new String(buffer, 0, bufferLength); 
      newarr.add(decoded); // OutOfMemory Exception. 
     } 

     fileOutput.close(); 
     buffer = null; 
     inputStream.close(); 
     String path = file.getAbsolutePath(); 
     return path; 
    } catch (final MalformedURLException e) { 
     e.printStackTrace(); 
     return ""; 
    } catch (final IOException e) { 
     e.printStackTrace(); 
     return ""; 
    } catch (final Exception e) { 
     System.out.println("EXCEPTION:: " + e.getMessage()); 
     e.printStackTrace(); 
     return ""; 
    } 
+1

Попробуйте использовать 'StringBuilder' вместо' String' и проверьте, помогает ли это. – Apoorv

+0

Спасибо за ваш ответ. Я попробовал только сейчас, но это не сработало. получив ту же ошибку. – user2085965

+0

Попробуйте прокомментировать 'newarr.add (decoded);' и посмотреть, продолжает ли он сбой. – Apoorv

ответ

-1

максимальная пропускная способность ArrayList (или любой вид списка вообще) ограничен только количеством памяти виртуальной машины Java имеет в наличии.

U может использовать BufferedReader, или, возможно, сканер вместо String.

Если вы все еще хотите использовать String, попробуйте увеличить JVM. Насколько я знаю, нет способа контролировать размер кучи во время выполнения.

Возможно, это не обязательно: вы можете обеспечить минимальный и максимальный размер кучи с помощью переключателей -Xms и -Xmx соответственно. (например, -Xms128m -Xmx512m) jvm будет управлять фактическим размером кучи в этих границах.

Попробуйте установить ограничение в соответствии с вашим использованием

Для более референс попытаться получить некоторое представление от

http://www.coderanch.com/t/614644/Performance/java/Arraylist-heapsize-memory-error

0

Вы должны обрабатывать поток непосредственно вместо того, чтобы хранить его в виде строки. Посмотрите на Gson поток чтения в качестве примера:

public List<Message> readJsonStream(InputStream in) throws IOException { 
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8")); 
    List<Message> messages = new ArrayList<Message>(); 
    reader.beginArray(); 
    while (reader.hasNext()) { 
     Message message = gson.fromJson(reader, Message.class); 
     messages.add(message); 
    } 
    reader.endArray(); 
    reader.close(); 
    return messages; 
} 

Вы можете думать о Перечне здесь разобранного результат. Вы также можете использовать список из любого ListAdapter, который вы используете, если хотите его отобразить.

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

  • Нет связанных вопросов^_^