我尝试这样做:Decompress Rar file in Android
但是我的一个rar文件无法解压缩。
日志:
01-01 17:41:32.121: E/AndroidRuntime(12799): FATAL EXCEPTION: Thread-771
01-01 17:41:32.121: E/AndroidRuntime(12799): java.lang.OutOfMemoryError
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.github.junrar.unpack.ppm.SubAllocator.startSubAllocator(SubAllocator.java:146)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.github.junrar.unpack.ppm.ModelPPM.decodeInit(ModelPPM.java:216)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.github.junrar.unpack.Unpack.readTables(Unpack.java:656)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.github.junrar.unpack.Unpack.unpack29(Unpack.java:165)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.github.junrar.unpack.Unpack.doUnpack(Unpack.java:120)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.github.junrar.Archive.doExtractFile(Archive.java:500)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.github.junrar.Archive.extractFile(Archive.java:442)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.github.junrar.testutil.ExtractArchive.extractArchive(ExtractArchive.java:73)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.github.junrar.testutil.ExtractArchive.extractArchive(ExtractArchive.java:29)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.letusread.util.DeCompressUtil.deCompress(DeCompressUtil.java:140)
01-01 17:41:32.121: E/AndroidRuntime(12799): at com.letusread.activity.FileListActivity$7.run(FileListActivity.java:338)
01-01 17:41:32.121: E/AndroidRuntime(12799): at java.lang.Thread.run(Thread.java:856)
01-01 17:41:32.324: E/MobclickAgent(12799): onEndSession called before onStartSession
我的文件已解压缩但我的应用程序崩溃了! 其他文件可以正确解压缩; 你能帮我解决这个错误吗?
答案 0 :(得分:0)
似乎问题在于分配堆内存以提取文件。您可以在文件SubAllocator.java的第146行看到OutOfMemoryError。在这一行上是字节数组初始化:
heap = new byte[realAllocSize];
显然,变量 realAllocSize 大于可用的空闲内存,该内存在堆上,以字节为单位。在Android设备上,每个VM的堆大小通常为32或64 MB(每个活动都有自己的VM)。似乎问题在于junrar库,它没有在Android设备上使用并且消耗大量内存。
答案 1 :(得分:0)
事实上,它似乎是一个实施的错误。这是我使用的解决方法,以避免此问题:
在 com.github.junrar.unpack.ppm.ModelPPM.java 中,第196行:MaxMB = unpackRead.getChar();
方法getChar
,在某些奇怪的情况下,返回一个非常大的数字。这应该是由于junrar不支持断页或头选项。
我的解决方法是检查MaxMB是否大于1并设置为1.我已经使用此修复程序很长一段时间没有问题。
int MaxMB = 0;
if (reset) {
MaxMB = unpackRead.getChar();
if (MaxMB > 1) { //Workaround
MaxMB = 1;
}
}