2012-01-22 3 views
3

j'ai trouvé un code, mais ont parfois erreur:java.lang.OutOfMemoryError comment résoudre ce

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) 

erreur sur cette ligne

strHeaders.append(c); 

s'il vous plaît une peut m'aider à résoudre ce problème?

Répondre

5

Puisque char est un type non signé, votre condition de boucle while ne sera jamais satisfaite, même après stream.read() commence à renvoyer -1. Si vous ne trouvez pas une séquence "\r\n\r\n", la boucle ne se terminera jamais. Ecrire la boucle comme ceci:

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; 
    } 
} 

Notez que de nombreux serveurs renverront mal "\n\n" que la ligne blanche qui signale la fin de l'en-tête. Certains peuvent également renvoyer "\r\r". À moins que vous ne contrôliez la sortie du serveur et que vous ayez la garantie qu'il verra "\r\n\r\n", votre méthode de détection de ligne vide doit être écrite de manière plus robuste.

+0

MERCI BEAUCOUP !!!!! – Peter

0

Cela a plus à voir avec le fichier que vous êtes en train de lire. Si la taille du fichier est grande, vous allez rencontrer ce problème. Le meilleur pari sera de garder un contrôle sur la taille du fichier et de l'acheminer vers des morceaux plus petits. Plus vous mettez de données dans StringBuffer, plus votre mémoire sera chargée.

Questions connexes