在OutOfMemoryError错误AbstractStringBuilder enlargeBuffer错误、OutOfMemoryError、enlargeBuffer、AbstractStri

2023-09-12 10:16:28 作者:我若不狂谁替我坚强i

我读的流YouTube的响应,并将其转换为字符串。使用下面的code:

I am reading the youtube response in Stream and converting it to String. using the below code:

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

这code是工作在精细中的所有设备,除了Android 4.0的设备。我得到了下面的logcat:

This code is working in fine in all devices except Android 4.0 devices. I am getting the below 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)

请帮我克服这种错误。 在此先感谢。

Please help me to overcome this error. Thanks in Advance.

推荐答案

好了,OutOfMemoryError异常的到来显然,当虚拟机内存用完。这里最重要的一点是确切的堆栈跟踪可能不翔实,因为它可能发生的另一个线程使用所有的记忆。或什么的内存消耗发生在此之前,code这个线程,这code是唯一的救命稻草。这个网址肯定不包含字节太多,我认为这个问题是在另一个地方。

Well, OutOfMemoryErrors are coming obviously when the virtual machine runs out of memory. The important point here is that the exact stack trace might not be informative, because it could happen that another thread uses all of the memory. Or something memory-consuming happened on this thread before this code, and this code was only the "last straw". This URL certainly does not contain too many bytes, I think the problem is in another place.

您可以尝试内存分析器: Android ==>内存浅析==> Eclipse的内存分析器?

You could try a memory analyzer: Android ==> Memory Analysing ==> Eclipse memory analyzer?