2012-12-18 6 views
12

Sto leggendo la risposta di YouTube in Stream e convertendola in String. usando il codice seguente:OutOfMemoryError in AbstractStringBuilder enlargeBuffer

URL: http://gdata.youtube.com/feeds/api/users/cnn/uploads?&v=2&max-results=25&alt=json

private String convertStreamToString(InputStream is) { 

     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder sb = new StringBuilder(); 

     String line = null; 
     try { 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      }   
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return sb.toString(); 
    } 

Questo codice funziona in fine in tutti i dispositivi tranne i dispositivi Android 4.0. Sto ottenendo il logcat seguente:

java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:278) 
     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
     at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.OutOfMemoryError 
     at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) 
     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145) 
     at java.lang.StringBuilder.append(StringBuilder.java:216) 
     at com.android.mypack.MyApplications.convertStreamToString(MyApplications.java:959) 
     at com.android.mypack.MyApplications.access$61(MyApplications.java:951) 
     at com.android.mypack.MyApplications$YoutubeTask.doInBackground(MyApplications.java:2303) 
     at com.android.mypack.MyApplications$YoutubeTask.doInBackground(MyApplications.java:1) 
     at android.os.AsyncTask$2.call(AsyncTask.java:264) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
     ... 5 more 
java.lang.OutOfMemoryError 
     at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) 
     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145) 
     at java.lang.StringBuilder.append(StringBuilder.java:216) 
     at com.android.mypack.MyApplications.convertStreamToString(MyApplications.java:959) 
     at com.android.mypack.MyApplications.access$61(MyApplications.java:951) 
     at com.android.mypack.MyApplications$YoutubeTask.doInBackground(MyApplications.java:2303) 
     at com.android.mypack.MyApplications$YoutubeTask.doInBackground(MyApplications.java:1) 
     at android.os.AsyncTask$2.call(AsyncTask.java:264) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
     at java.lang.Thread.run(Thread.java:856) 

Please help me per superare questo errore. Grazie in anticipo.

+0

Quanti byte sono provenienti da questo flusso? – lbalazscs

+0

@lbalazscs Si prega di consultare l'URL, Questa è la risposta che sto trattando .. Non so qual è il problema con i dispositivi 4.0. – wolverine

+0

qualsiasi soluzione hai? – CoronaPintu

risposta

1

Bene, OutOfMemoryErrors stanno arrivando ovviamente quando la macchina virtuale esaurisce la memoria. Il punto importante qui è che l'esatta traccia dello stack potrebbe non essere informativa, perché potrebbe accadere che un altro thread usi tutta la memoria. O qualcosa di consumante della memoria è successo su questo thread prima di questo codice, e questo codice era solo la "ultima goccia". Questo URL certamente non contiene troppi byte, penso che il problema sia in un altro posto.

Si potrebbe provare un analizzatore di memoria: Android ==> Memory Analysing ==> Eclipse memory analyzer?

+0

huh, ero sotto l'impressione che la VM avrebbe gettato questa eccezione dopo aver tentato un'allocazione e fallendo ... Ciò implicherebbe che la traccia dello stack è effettivamente utile, e, per di più, ha perfettamente senso per l'ingrandimento di un buffer per causare un'eccezione di oom ... – edthethird

+0

Ovviamente, la VM lo getterà dopo aver tentato un'assegnazione e aver fallito. La domanda è se questa allocazione fosse solo la "ultima goccia" dopo altre allocazioni o la causa principale. Questo flusso contiene circa 110 KByte di dati, non dovrebbe essere troppo. – lbalazscs

+1

ahh ok. si, tutto quello che possiamo sapere è che questa è stata l'ultima goccia. è molto probabile/probabile che abbia una perdita di memoria altrove – edthethird