2012-12-18 6 views
12

私はStreamでyoutubeレスポンスを読み、Stringに変換しています。以下のコードを使用して:OutOfMemoryError at 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(); 
    } 

をこのコードは、Android 4.0デバイスを除くすべてのデバイスで罰金で働いています。私は以下の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) 

私はこのエラーを克服するために手伝ってください。 ありがとうございました。

+0

どのように多くのバイトは、このストリームから来ていますか? – lbalazscs

+0

@lbalazscs URLを参照してください、それは私が処理している応答です。私は4.0デバイスの問題は何か分かりません。 – wolverine

+0

どんな解決策がありますか? – CoronaPintu

答えて

1

まあ、OutOfMemoryErrorsは、仮想マシンのメモリが不足しているときに明らかです。ここで重要な点は、別のスレッドがすべてのメモリを使用する可能性があるため、正確なスタックトレースが有益ではない可能性があることです。または、このコードの前にこのスレッドで何らかのメモリ消費が発生し、このコードは「最後のストロー」に過ぎませんでした。このURLは確かにあまりにも多くのバイトを含んでいない、私は問題が別の場所にあると思う。

あなたはメモリアナライザを試みることができる: Android ==> Memory Analysing ==> Eclipse memory analyzer?

+0

huh、私は、VMが割り振りを試みて失敗した後にこの例外をスローするという印象を受けました...それは実際にはスタックトレースを意味し、実際には役に立ちます。その上、バッファを大きくしてoom例外... – edthethird

+0

もちろん、VMは割り当てを試みて失敗した後にこれをスローします。問題は、この配分が他の配分の後の「最後の麦わら」か根本原因かどうかということです。このストリームには約110 KBのデータが含まれています。 – lbalazscs

+1

ahh ok。ええ、私たちが確かに知ることができるのは、これが最後のわらです。それは非常に可能性があります/おそらく彼は他の場所でメモリリークを持っています – edthethird