■getDrawingChacheでハマッタ

最近、サイトの仕事が続いていたので更新していませんでしたが、
またしばらくAndroidの仕事になりそうです。
また、個人的にハマッた事を書いて行きたいと思います。

今回は、getDrawingCacheネタです。

カメラを使ったアプリ作成のお仕事でとりあえずとあるブログのカメラにオーバーレイを重ねるサンプルコードをコピペもといありがく拝読させていただいき、撮影をしてみた。

連続で撮影をすると2度目はcanvas上でのdrwawBitmapで何故か落ちる現象に悩んだ。
メモリ解放等をしっかりやってみたが、何故か落ちる状態でいろいろ試した結果。
overlay画像を表示しているviewからgetDrawingCacheで取得したビットマップが何かおかしくて、その他のコードは問題ないという結論。

ためしにdestroyDrawingCacheを書いてみたら上手くうごいた。

google先生にgetDrawingCacheで検索してみると、英語しかひっかからないという涙目状態でマニュアルのチェックから始め。
buildDrawingCacheを手動で呼んだらdestroyDrawingCacheをよんでキャッシュを解放してあげてねという記述は発見。
そのご英語フォーラムから
getDrawingCacheを呼ぶとbuildDrawingCacheを呼ぶっぽいから、うんたらかんたらdestroyDrawingCacheという記述をみつけた。

うんたらかんたらは自分の語学力不足で翻訳できなかったが、
とにかくgetDrawingCacheを呼ぶとbuildDrawingChacheに近しいことを内部てきに勝手にやっているからdestroyDrawingCahceを呼んであげないと色々おかしくなるということが分かった。

(メモリ参照が壊れて、不正なメモリアクセスになるのかな、たぶん)

下記のようなコードを試したところ
Bitmap bitmap = view.getDrawingCache;
view.destroyDrawingCache();

bitmapをcanvas上に合成

bitmap解放

見事に落ちた。

ということは
getDrawingCacheというのは
DrawingChacheへの参照を返しているだけで
使用前にdestroyすると解放されるっぽいらしい。

Bitmap bitmap = view.getDrawingCache;

bitmapをcanvas上に合成

bitmap.recycle();
bitmap = null;
view.destroyDrawingCache();

上記で連写しても落ちなくなった。

たぶん概ね英語の解釈は正しいと思うが、
AndroidSDKの神がいたら、正しい解釈を教えてください><