「Bitmap#recycleを呼ぶと必要になればメモリを解放してくれて、解放済みかは Bitmap#isRecycledでわかる」的な説明がネットにはたくさんあり、実際 recycleを呼ぶようにすると OOM対策にはなる。
が、「メモリを解放してくれるタイミングってどうなの?」「Bitmap#recycleをキャンセルするようなメソッドは見つからないけど、Bitmap#isRecycledが falseを返したとして Bitmap#recycleを呼んでいる以上、非同期で解放される事を考えたら使えなくね?」という疑問が残る。
というわけで、ソースを覗いてみた。
結果、「Bitmap#recycleを呼んだ時点で Bitmap#isRecycledは常に trueを返すようになる」と言うことがわかった。*1
つまり、心配していたことは杞憂に過ぎなかったわけだ。
結局、Bitmapへの参照が残っている状態でもメモリを解放するためのメソッドな訳か。
ちなみに、ファイナライザは nativeDestructor、recycleは nativeRecycleを呼んでいるので、すぐに解放しないために何かはやっているらしい。
*1 実際にどのタイミングでメモリが解放されるのかはネイティブコードまで追わないとわからないけど、今回はそこまでする必要がないのでね。