まず、java.lang.OutOfMemoryError
に関する質問を理解しています。ビットマップは以前に何度も尋ねられています。私もDisplaying Bitmaps Efficientlyページをチェックアウトしました。100文字列をバイト配列に変換するときのjava.lang.OutOfMemoryError
私のユースケース:
私はSQLiteのデータベースに文字列として二つの異なるサイズのビットマップを格納しています。ビットマップの最初のサイズは画面幅の50%で、第2サイズは画面幅の100%です。
私は、画像幅の50%または100%の画像を表示するRecyclerViewを使用しているため、ロードされているビットマップは、必要以上に大きくなく、イメージはデータベースから取得されます。
また、AsyncTaskを使用してビットマップをロードしています。
私はRecyclerViewに180以上のアイテムがありますので、360以上のビットマップ(numberOfimages * theDifferentSizesOfEachImage)が作成されています。私はこのコードを介して、バイト配列に画像の文字列バージョンをcoverting午前:byte [] byteArray = Base64.decode(encodedString, Base64.DEFAULT);
問題私はそれを再起動しない限り
活性は、java.lang.OutOfMemoryError
をencurringことなく、170枚の異なる画像の周りにオーバーロードすることができましたアクティビティ(例えば、アクティビティを読み込んだり、ナビゲーション・ドロワを再度クリックしてアクティビティを再作成した後、そのプロセスを繰り返すなど)、文字列をバイト配列に変換するときにjava.lang.OutOfMemoryError
が発生します。
私は、次のコードを使用してグライドライブラリ使用してビットマップにバイト配列に変換しています:私はjava.lang.OutOfMemoryError
をしながら発生を避けるにはどうすればよい
Bitmap bitmap = Glide.with(context).load(byteArray).asBitmap()
.dontTransform().dontAnimate().skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE).into(-1, -1).get();
を一言で言えば
で私の質問を文字列をバイト配列に変換していますか?
注
私は与えられたビットマップ上のリサイクル()を呼び出していグライドを使用してビットマップを作成し、null
にそれを設定した後。
また、私はすでに、事前に私のAndroidのマニフェスト
おかげでandroid:largeHeap="true"
を
編集ここ
私はビットマップ文字列を作成していますどのようにされて使用しています:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.WEBP,100, baos);
byte [] b =baos.toByteArray();
String bitmapString = Base64.encodeToString(b, Base64.DEFAULT);
なぜあなたはそれを保存する前にそれを圧縮しないでください... –
あなたの応答に感謝します。あなたがビットマップを圧縮することを言及しているなら、私はすでにそれをしています。自分の質問を編集し、ビットマップを圧縮してから文字列に変換する方法を確認できます。 –
"SQLiteデータベースに2つの異なるサイズのビットマップを格納しています" - なぜ?それらをデータベースにファイル名でファイルとして保存します。または、BLOB列として格納して、少なくとも 'String'変換を排除します。 – CommonsWare