私のアプリには、いくつかの ImageButtons を含むレイアウトがあります。さらに、私のアプリは、後で使用するためにいくつかのビットマップをレンダリングします。ビットマップは、ビットマップ パラメータを使用してキャンバスを作成し、キャンバスに描画することによってレンダリングされます。このビットマップ レンダリング タスクは非 UI スレッドで発生するため、ビットマップのレンダリング中に GUI の応答性を維持できます。
ANR が発生しています。ImageButton.draw() メソッドが完了していないことが原因のようです。さらに、ImageButton の描画中にビットマップ レンダリング タスクがレンダリングを開始するため、メソッドが完了しないようです。
以下は、ログ出力別のコード スニペットと、ANR の traces.txt ファイルです。
UI 以外のスレッドで Canvas に描画すると ImageButton.draw() がハングする可能性があるという私の結論は可能ですか? もしそうなら、これを修正するための提案はありますか?
private class BitmapRenderTask implements Runnable
{
...
public void run()
{
Log.e("start render task", rect.toString());
...
Canvas canvas = new Canvas(bitmap);
Log.e("created canvas", "created canvas");
//do stuff to draw into canvas
Log.e("drew to canvas", "drew to canvas");
...
Log.e("done, exit", rect.toString());
public class MyImageButton extends ImageButton
{
public void draw(Canvas canvas)
{
Log.e("start drawing", this.toString());
super.draw(canvas);
Log.e("end drawing", this.toString());
}
}
My log:
04-24 14:10:12.115: E/start render task(9446): 1 Rect(512, 0 - 800, 512)
04-24 14:10:12.230: E/start drawing(9446): MyButton1
04-24 14:10:12.230: E/end drawing(9446): MyButton1
04-24 14:10:12.230: E/start drawing(9446): MyButton2
04-24 14:10:12.230: E/end drawing(9446): MyButton2
04-24 14:10:12.230: E/start drawing(9446): MyButton3
04-24 14:10:12.230: E/end drawing(9446): MyButton3
04-24 14:10:12.230: E/start drawing(9446): MyButton4
04-24 14:10:12.235: E/end drawing(9446): MyButton4
04-24 14:10:12.235: E/start drawing(9446): MyButton5
04-24 14:10:12.235: E/end drawing(9446): MyButton5
04-24 14:10:12.235: E/start drawing(9446): MyButton6
04-24 14:10:12.390: E/drew to canvas(9446): drew to canvas
04-24 14:10:12.395: E/done, exit(9446): Rect(512, 0 - 800, 512)
04-24 14:10:12.395: E/start render task(9446): Rect(0, 1024 - 512, 1084)
04-24 14:10:12.410: E/drew to canvas(9446): drew to canvas
04-24 14:10:12.395: E/done, exit(9446): Rect(0, 1024 - 512, 1084)
traces.txt: