Подтвердить что ты не робот

OutOfMemoryError в AbstractStringBuilder enlargeBuffer

Я читаю ответ youtube в Stream и преобразовываю его в String. используя приведенный ниже код:

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)

Пожалуйста, помогите мне преодолеть эту ошибку. Спасибо в Advance.

4b9b3361

Ответ 1

Ну, OutOfMemoryErrors приходят явно, когда на виртуальной машине заканчивается память. Важным моментом здесь является то, что точная трассировка стека может быть неинформативной, потому что может случиться, что другой поток использует всю память. Или что-то такое, что произошло в этом потоке, до этого кода, и этот код был только "последней каплей". Этот URL, конечно, не содержит слишком много байтов, я думаю, что проблема находится в другом месте.

Вы можете попробовать анализатор памяти: Android == > Анализ памяти == > Анализатор памяти Eclipse?