3

SO を使用して 1 年間質問を解決した後、解決策が見つからない問題に遭遇しました。

複数のスレッドを使用してビットマップを計算しています。ビットマップの新しい行が計算されると、カスタム ビューを更新し、invalidate() を呼び出します。しかし、携帯電話を回転させると、ビットマップの更新が停止します。別の画面回転の後、View は 1 回だけ更新され、その間に計算されたビットマップの一部も表示されます。

onCreate メソッドの一部:

        view = (MyView) findViewById(R.id.view1);

    if (savedInstanceState != null)
    {
        bitmap = savedInstanceState.getParcelable("bitmap");
        view.bitmap = bitmap;
    }
    else
    {
        bitmap = Bitmap.createBitmap(400, 500, Bitmap.Config.ARGB_8888);
        bitmap.eraseColor(Color.GRAY);
        view.bitmap = bitmap;
    }

handlerビューを更新するために使用します:

        public void handleMessage(final Message msg) {

        Log.i("Recieved", "redraw signal");
        view.bitmap = bitmap;
        view.invalidate();  
    }

私の見解では、私は使用します:

       Bitmap bitmap;
   Rect rect;

   //...constructors

   @Override
   protected void onSizeChanged (int w, int h, int oldw, int oldh)
   {
       rect = new Rect(0, 0, getWidth(), getHeight());
   }

   @Override
   protected void onDraw(Canvas canvas)
   { 
       super.onDraw(canvas);
       if (bitmap!=null)
       {               
           canvas.drawBitmap(bitmap, null, rect, null);
       }
        Log.i("onDraw", "draw"); 
   }

解決

これまでのところ、私は1つの解決策を見つけました。invalidate()の最後に追加すると、onDraw画面の向きが変更された後、ビットマップが(行ごとに)正しく更新されます。これは非常に「クリーンな」ソリューションだとは思わないので、構成の変更後に無視され invalidate()てから呼び出される理由を理解したいですか?handler

ありがとう!

4

1 に答える 1

1

解決策を見つけました。

問題はハンドラにあり、静的ではありませんでした。長い遅延メッセージを投稿していなかったので、「リークが発生する可能性があります」という警告を無視しました。大きな間違いです。構成の変更後、Handler が View に到達できなかったためです。

ここに解決策があります:

    static class MyHandler extends Handler {
    private final WeakReference<MainActivity> mTarget;

    public MyHandler(MainActivity target) {
        mTarget = new WeakReference<MainActivity>(target);

    }

    @Override
    public void handleMessage(Message msg) {
         MainActivity target = mTarget.get();
...other stuff...
        target.view.invalidate(); // now this works after configuration change

    }

}

結論:ここで説明されているように、静的ハンドラーを使用します

于 2012-12-26T10:25:00.947 に答える