私はAndroidの初心者です!巨大なビットマップ (> 1200 * 1000) を使用するアプリを開発しているため、Android の SDK にいくつかの大きな問題があります。アプリの実行中に同じサイズの複数のレイヤー/ビットマップ (3-5 個) が必要です。 . 問題は、メモリ ヒープがこれらの割り当ての 1 つで非常に急速に消費され、OutOfMemory 例外がトリガーされることです。
良い点は、すべてのビットマップを同時に必要としないことです。
recycle() メソッドの呼び出しを試みましたが、ビットマップのメモリがネイティブ メモリではなくヒープに存在するため、廃止されていることは理解していました。また、特定のビットマップからすべての参照を削除しようとしましたが、 System.gc() を手動で呼び出しても使用できませんでした。ビットマップを削除できませんでした。わかりました、私が知らないメモリリークがあるかもしれませんが、私はそれを疑っています.
私はあらゆる種類の解決策を試しましたが、どれもうまくいきません。
私にとって最良の選択はビットマップを再利用することでしたが、BitmapFactory のデコード メソッドは、メモリを消費する新しいビットマップを割り当てることしか知りません。
私の質問は、Android で動作するビットマップ ピクセルを再利用する (別のビットマップ/ピクセル配列を割り当てずにビットマップのピクセルを上書きする) 方法を知っていますか ??? 問題は、GarbageCollector ソリューションに常駐できないことです。これらのビットマップがメモリから削除されているか、他のビットマップが割り当てられていないことを確認する必要がある特定の瞬間がアプリにあるためです。
別の解決策は次のとおりです。ヒープメモリを通過せずに、ビットマップをSDカードに直接描画する方法を知っていますか? 大きなビットマップ (元のサイズの 2 倍) を割り当てて、他の 2 つの処理済みビットマップを連結しようとすると、クラッシュする瞬間があります) ... それが私が尋ねている理由です。Canvas や他の描画オブジェクトをデータ ストリームから直接インスタンス化する可能性はありますか?
他の解決策は、ヒープメモリをシミュレートする仮想スワップメモリのようなものを利用することですが、SDCARDまたは何かにキャッシュします。しかし、これを行う方法も見つかりません。