13

我正在阅读 Stream 中的 youtube 响应并将其转换为字符串。使用以下代码:

网址: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)

请帮助我克服这个错误。提前致谢。

4

1 回答 1

2

好吧,当虚拟机内存不足时,显然会出现 OutOfMemoryErrors。这里重要的一点是,确切的堆栈跟踪可能无法提供信息,因为另一个线程可能会使用所有内存。或者在这段代码之前在这个线程上发生了一些消耗内存的事情,而这段代码只是“最后一根稻草”。这个网址肯定不包含太多字节,我想问题出在别的地方。

你可以试试内存分析器: Android ==> 内存分析 ==> Eclipse 内存分析器?

于 2012-12-18T19:37:32.437 回答