0

私のアプリには、いくつかの 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:

http://pastebin.com/s98nEyYt

4

1 に答える 1

0

描画が、たとえばあなたによって開始されたボタンの作成の一部である場合setContentView(R.layout.screen);、(私が正しく理解していれば) 非同期タスクがまだビットマップをレンダリングしている間に、コードがボタンを終了しようとして実行される可能性があります。

私は次のことを試します:

  1. IUが本当に遅くなるかどうかを確認するためだけに、バックグラウンドの非同期タスクなしですべてを同期的に実行します。複雑なユーザー定義のウィジェットが作成されるケースがいくつかあります - すべて問題なく十分に高速です

  2. デフォルトの単純なドローアブルで btn を作成し、非同期タスクまたはハンドラーを使用したその他のバックグラウンド タスクを使用する準備ができたら、時間のかかる代替手段を入力します。

私たちに知らせてください!

于 2012-04-24T17:33:42.327 に答える