1

1.8MB の画像をバイトに変換してから暗号化し、最終的に文字列に変換するときにメモリ不足の例外に直面しています (ログに出力される長さは 1652328 です)。次に、この文字列を XML 形式に追加して投稿します。ここで、実際の問題が発生します。このpictureStringにいくつかのタグを追加している間StringBuffer、またはStringBuilder文字列に追加するか、メモリ不足の例外が発生しています。この問題を解決するにはどうすればよいですか?

小さな画像の場合、この問題は再現されません。

以下のコードは、パスの画像を に変換しpathますString

fis = new FileInputStream(path);
buffer = new byte[fis.available()];
try {
    fis.read(buffer, 0, buffer.length);
    String byteString = 
        com.mobile.android.components.Base64.encodeBytes(buffer);
    return byteString;
} catch (IOException ex) {

}

上記byteStringは、次のように xml post に追加されます。

StringBuilder pictureName = new StringBuilder();
pictureName.append(byteString ); //here array out of bound at StringBuilder.extendBuffer
..........
appending continues

更新しました

上記の追加では、encodedbyteStreamは cypher AES を使用して暗号化されてから に追加されStringBuilderます。

4

2 に答える 2

1

bitmap.recycle();ビットマップをバイト配列に変換したらすぐに呼び出します。これにより、このビットマップに関連付けられたネイティブ オブジェクトが解放され、ピクセル データへの参照がクリアされます。

アップデート

ファイルストリームから読み取られたメモリチャンクが大きすぎて処理できないことは明らかです。ファイル全体を一度に読み取ることは避けてください。それを少しずつ行います。中間文字列オブジェクトを使用せずに、文字列を xml に追加します。

更新 2

サーバーに送信するときにxmlファイル全体をロードしないようにするために、このようなことを行うことができます。

// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);

// Enable POST method
connection.setRequestMethod("POST");

outputStream = new DataOutputStream( connection.getOutputStream() );
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);

while (bytesRead > 0)
{
    outputStream.write(buffer, 0, bufferSize);
    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}

次に、境界文字を書き込み、ストリームをフラッシュして閉じます。

于 2011-09-26T16:38:15.103 に答える
0

サポートしてくれてありがとう。

最後に、ファイル操作を使用してコードを最大限に最適化しました。

私が使用Base64.encodeFileToFile(picturePath, encodedPicturePath); したエンコードでは、エンコードされた画像をファイルに保存しました。そして、暗号化CypherOutPutStreamのために、コンストラクターで FileOutputStream が渡される場所を使用しました。したがって、暗号化もファイルを使用して行われます。最後のステップは、HttpPost を使用しているときに、暗号化されたデータの合計を として送信していました。StringEntityこれは の最終的なハードルですOutOfMemeoryException。StringEntity を に変更しましたFileEntity

注: エンコードされた画像をチャンクで暗号化しないでください。これにより、エンコードされたデータ全体が変更されます。

失敗: エンコードにファイルを使用する前に、画像全体をチャンクしてファイルにエンコードしましたが、エンコードされたファイルをデコードすると、元の画像を取得できませんでした。

よろしく、シャ

于 2011-10-10T05:56:17.687 に答える