Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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
Java 在Android上解压RAR文件时发生OutOfMemoryError_Java_Android_Rar - Fatal编程技术网

Java 在Android上解压RAR文件时发生OutOfMemoryError

Java 在Android上解压RAR文件时发生OutOfMemoryError,java,android,rar,Java,Android,Rar,我试着这样做: 但是我的一个rar文件无法解压缩 日志: 我知道该文件已解压缩,但我的应用程序已崩溃! 其他文件可以正确解压缩; 您能帮我解决这个错误吗???看来问题在于分配堆内存来提取文件。您可以看到文件的第146行有OutOfMemoryError。这一行是字节数组初始化: heap = new byte[realAllocSize]; 显然,变量realAllocSize比堆上可用的可用内存(以字节为单位)大。在Android设备上,每个VM的堆大小通常为32或64 MB,每个活动都有自

我试着这样做:

但是我的一个rar文件无法解压缩

日志:

我知道该文件已解压缩,但我的应用程序已崩溃! 其他文件可以正确解压缩;
您能帮我解决这个错误吗???

看来问题在于分配堆内存来提取文件。您可以看到文件的第146行有OutOfMemoryError。这一行是字节数组初始化:

heap = new byte[realAllocSize];

显然,变量realAllocSize比堆上可用的可用内存(以字节为单位)大。在Android设备上,每个VM的堆大小通常为32或64 MB,每个活动都有自己的VM。问题似乎出在junrar库中,该库未优化以在Android设备上使用,并消耗大量内存。

事实上,这似乎是实现的一个缺陷。这是我为避免问题而使用的解决方法:

在com.github.junrar.unpack.ppm.modelpm.java中,第196行:MaxMB=unpacread.getChar

在某些奇怪的情况下,getChar方法返回一个非常大的数字。这应该是由于损坏的标头或junrar不支持的标头选项造成的

我的解决方法是检查MaxMB是否大于1并设置为1。我已经使用此修复程序很长时间了,没有出现任何问题

int MaxMB = 0;
if (reset) {
    MaxMB = unpackRead.getChar();
    if (MaxMB > 1) { //Workaround
        MaxMB = 1;
    }
}

您可能需要寻找一种不同的RAR解压实现,该实现更高效,因此更适合移动电话和平板电脑。仅876kb,包含一个txt文件和一个html文件:你的堆大小超出了限制尝试调试代码是的,但我能做什么?调试你的代码并检查堆大小突然增加的时间,如果它不适合实现,那么还可以找到另一个`是的,我刚刚检查了源代码,但你们有什么好办法吗?我会试着决定junrar库消耗了多少内存。如果它远远超过可用的堆内存,那么最好找到另一个库进行rar解压缩。但是,如果库分配的内存只有几MB,那么问题可能是应用程序的另一部分占用了太多内存。您可以看到,大多数rar文件都可以成功解压缩,但只有少数人抛出了outofmemory异常。这就是我无法理解的原因。当我查看junrar源代码时,我认为用于提取文件的堆内存的分配取决于rar文件头中的一些信息。这应该可以解释为什么有些文件被成功提取,而有些文件没有。也许这取决于压缩级别或其他一些属性,这些属性在不同rar文件的头中是不同的。哦,但是其他一些应用程序可以轻松解压缩这个rar文件,我正在尝试解决这个问题。
int MaxMB = 0;
if (reset) {
    MaxMB = unpackRead.getChar();
    if (MaxMB > 1) { //Workaround
        MaxMB = 1;
    }
}