有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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


共 (2) 个答案

  1. # 1 楼答案

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

    com中。github。朱拉。打开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;
        }
    }
    
  2. # 2 楼答案

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

    heap = new byte[realAllocSize];
    

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