1

我尝试这样做: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

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

4

2 回答 2

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;
    }
}
于 2014-11-20T15:00:12.870 回答
0

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

heap = new byte[realAllocSize];

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

于 2013-01-01T10:40:30.777 回答