2012-01-22 4 views
3

я нашел код, но иногда ошибки:java.lang.OutOfMemoryError, как это исправить

StringBuilder strHeaders = new StringBuilder(); 
char c; 
while ((c = (char)stream.read()) != -1) { 
    strHeaders.append(c); 
    if (strHeaders.length() > 5 && (strHeaders.substring((strHeaders.length() - 4), strHeaders.length()).equals("\r\n\r\n"))) { 
     // end of headers 
     break; 
    } 
} 

LogCat

java.lang.OutOfMemoryError 
    at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95) 
    at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:140) 
    at java.lang.StringBuilder.append(StringBuilder.java:125) 
    at myApp.activity.com.getFromPLS.retreiveMetadata(getFromPLS.java:98) 
    at myApp.activity.com.getFromPLS.refreshMeta(getFromPLS.java:76) 
    at myApp.activity.com.myApp$1.run(myApp.java:371) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3683) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    at dalvik.system.NativeStart.main(Native Method) 

ошибку на этой линии

strHeaders.append(c); 

пожалуйста, любой один может помочь мне исправить это?

ответ

5

С char является неподписанным типом, ваше состояние цикла while никогда не будет удовлетворено, даже после того, как stream.read() начнет возвращаться -1. Если вы не найдете последовательность "\r\n\r\n", цикл никогда не закончится. Написать петлю так:

StringBuilder strHeaders = new StringBuilder(); 
int c; 
while ((c = stream.read()) != -1) { // DO NOT cast to char here! 
    strHeaders.append((char) c); 
    final int len = strHeaders.length(); 
    if (len > 5 && (strHeaders.substring(len - 4)).equals("\r\n\r\n"))) { 
     // end of headers 
     break; 
    } 
} 

Обратите внимание, что многие серверы будут ошибочно возвращать "\n\n" как пустая строка, которая сигнализирует конец заголовка. Некоторые могут также вернуть "\r\r". Если вы не контролируете вывод сервера и гарантируете, что он увидит "\r\n\r\n", ваш метод обнаружения пустой строки должен быть написан более надежным образом.

+0

СПАСИБО ВАМ ОЧЕНЬ !!!!! – Peter

0

Это больше относится к файлу, который вы читаете. Если размер файла большой, вы попадете в эту проблему. Лучше всего будет следить за размером файла и передавать его на меньшие куски. Чем больше вы поместите данные в StringBuffer, тем больше будет загружена ваша память.

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