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
ありがとう!