2012-12-18 8 views
12

Czytam odpowiedź youtube w Stream i konwertowanie go do String. za pomocą poniższego kodu:OutOfMemoryError w 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(); 
    } 

Ten kod działa w grzywny we wszystkich urządzeniach z wyjątkiem urządzeń Android 4.0. Dostaję poniżej logcat:

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) 

Proszę pomóż mi przezwyciężyć ten błąd. Dzięki z góry.

+0

Ile bajtów pochodzących z tego strumienia? – lbalazscs

+0

@lbalazscs Proszę zobaczyć adres URL, To jest odpowiedź, którą obsługuję .. Nie wiem, jaki jest problem z urządzeniami 4.0. – wolverine

+0

jakieś rozwiązanie masz? – CoronaPintu

Odpowiedz

1

Cóż, OutOfMemoryErrors przychodzą oczywiście, gdy na maszynie wirtualnej zabraknie pamięci. Ważną kwestią jest to, że dokładny ślad stosu może nie być pouczający, ponieważ może się zdarzyć, że inny wątek wykorzystuje całą pamięć. Albo coś pochłaniającego pamięć stało się w tym wątku przed tym kodem, a ten kod był tylko "ostatnią kroplą". Ten adres URL z pewnością nie zawiera zbyt wielu bajtów, myślę, że problem jest w innym miejscu.

można spróbować analizator pamięci: Android ==> Memory Analysing ==> Eclipse memory analyzer?

+0

huh, byłem pod wrażeniem, że VM rzuciłaby ten wyjątek po próbie alokacji i awarii ... To oznaczałoby, że ślad stosu jest rzeczywiście użyteczny, a ponadto ma sens w powiększaniu bufora, aby spowodować Oom wyjątek ... – edthethird

+0

Oczywiście VM rzuci to po próbie alokacji i awarii. Pytanie brzmi, czy alokacja ta była jedynie "ostatnią kroplą" po innych alokacjach czy głównej przyczynie. Strumień ten zawiera około 110 KB danych, nie powinien za dużo. – lbalazscs

+1

ahh ok. tak, wszystko, co możemy wiedzieć na pewno, to była ostatnia kropla. jest bardzo prawdopodobne/prawdopodobne, że ma wyciek pamięci gdzie indziej – edthethird

Powiązane problemy