Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android java.lang.OutOfMemoryError如何修复此错误_Android - Fatal编程技术网

Android java.lang.OutOfMemoryError如何修复此错误

Android java.lang.OutOfMemoryError如何修复此错误,android,Android,我发现了一个代码,但有时会出现错误: StringBuilder strHeaders = new StringBuilder(); char c; while ((c = (char)stream.read()) != -1) { strHeaders.append(c); if (strHeaders.length() > 5 && (strHeaders.substring((strHeaders.length() - 4), strHeaders.l

我发现了一个代码,但有时会出现错误:

StringBuilder strHeaders = new StringBuilder();
char c;
while ((c = (char)stream.read()) != -1) {
    strHeaders.append(c);
    if (strHeaders.length() > 5 && (strHeaders.substring((strHeaders.length() - 4), strHeaders.length()).equals("\r\n\r\n"))) {
        // end of headers
        break;
    }
}
logcat

java.lang.OutOfMemoryError
    at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
    at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:140)
    at java.lang.StringBuilder.append(StringBuilder.java:125)
    at myApp.activity.com.getFromPLS.retreiveMetadata(getFromPLS.java:98)
    at myApp.activity.com.getFromPLS.refreshMeta(getFromPLS.java:76)
    at myApp.activity.com.myApp$1.run(myApp.java:371)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)
这行有错误

strHeaders.append(c);

请任何人帮我解决这个问题?

因为
char
是一种无符号类型,所以即使在
stream.read()
开始返回-1之后,
while
循环条件也永远不会满足。如果找不到
“\r\n\r\n”
序列,循环将永远不会结束。按如下方式编写循环:

StringBuilder strHeaders = new StringBuilder();
int c;
while ((c = stream.read()) != -1) { // DO NOT cast to char here!
    strHeaders.append((char) c);
    final int len = strHeaders.length();
    if (len > 5 && (strHeaders.substring(len - 4)).equals("\r\n\r\n"))) {
        // end of headers
        break;
    }
}

注意,许多服务器将错误地返回<代码>“\n \n”< /代码>,作为指示标题末尾的空白行。有些还可能返回

“\r\r”
。除非您控制服务器输出并保证它将看到
“\r\n\r\n”
,否则需要以更健壮的方式编写空行检测方法。

这与您正在读取的文件有更多关系。如果文件大小较大,则您将陷入此问题。最好的办法是检查文件大小,并将其传输到较小的块中。在StringBuffer中放入的数据越多,内存的负载就越大