1

私はこのようにしようとしています: AndroidでRarファイルを解凍する

しかし、私のrarファイルの1つは解凍できません。

ログ:

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

ファイルを抽出するためのヒープメモリの割り当てに問題があるようです。ファイルSubAllocator.javaの 146 行目に OutOfMemoryError があることがわかります。この行では、バイト配列が初期化されています。

heap = new byte[realAllocSize];

どうやら変数realAllocSizeは、ヒープ上にある使用可能な空きメモリ (バイト単位) よりも大きいようです。Android デバイスでは、各 VM のヒープ サイズは通常 32 または 64 MB です (各アクティビティには独自の VM があります)。問題は、Android デバイスでの使用に最適化されておらず、多くのメモリを消費する junrar ライブラリにあるようです。

于 2013-01-01T10:40:30.777 に答える
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 に答える