2012-12-18 52 views
12

我正在讀取Stream中的YouTube響應並將其轉換爲String。使用下面的代碼:AbstractStringBuilder上的OutOfMemoryError enlargeBuffer

網址: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

呵呵,我覺得虛擬機在嘗試分配和失敗後會拋出這個異常......這意味着堆棧跟蹤實際上是有用的,而且,最重要的是,放大緩衝區是非常有意義的一個例外... – edthethird

+0

當然,虛擬機在嘗試分配和失敗後會拋出這個錯誤。問題是這種分配是否僅僅是其他分配或根本原因之後的「最後一根稻草」。這個流包含大約110千字節的數據,它不應該太多。 – lbalazscs

+1

啊好的。是的,我們可以肯定地知道這是最後一根稻草。很可能/他可能在其他地方有內存泄漏 – edthethird