2013年3月3日日曜日

Avoid object allocations during draw/layout operations (preallocate and reuse instead)


Viewを継承したクラスで、円などを描画させようとしたときに、eclipseから警告が出力されて悩んでいる人も多いかと思います。

例えば、以下のようなコーディングをすると

@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);

Paint paint = new Paint ();
paint.setColor(Color.BLUE);
canvas.drawCircle(100f, 100f, 50f, paint);

}

new Paint()に対して、以下の警告が出力されます。

Avoid object allocations during draw/layout operations (preallocate and reuse instead)

これは、onDraw()関数が呼ばれるたびに、Printオブジェクトが作成されてしまうのを避けてくださいという警告です。
従って、以下のように、Paintオブジェクトをメンバ変数で保持して、使い回すようにコーディングすればよいでしょう。

Paint mPaint = new Paint ();

@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);

mPaint.setColor(Color.BLUE);
canvas.drawCircle(100f, 100f, 50, mPaint);

}

尚、この警告は無駄なオブジェクト作成を指摘しているものなので、そのまま実行しても問題なく動きます。
とは言っても、ガーベージコレクションによるメモリ解放が多発し、パフォーマンスも落ちると思いますので、できる限りオブジェクトを使い回すようにコーディングしたほうがよいでしょう。

0 件のコメント:

コメントを投稿