SurfaceViewを使用して画面の一部に描画しています。これにより、背景スレッドで描画を更新します。surfaceviewは、SurfaceView.callbackを実装します。
onDrawメソッドでは、canvas.drawpont(x、y、paint)を使用して、キャンバスのほぼ全体をピクセルごとに描画するため、大画面ではかなり集中的に使用できます。とにかく、ランドスケープとリバースランドスケープの間で電話をすばやく回転させると、illegalArgumentExceptionが発生します。次のように:
06-18 15:03:05.853: E/AndroidRuntime(29969): FATAL EXCEPTION: Thread-45
06-18 15:03:05.853: E/AndroidRuntime(29969): java.lang.IllegalArgumentException
06-18 15:03:05.853: E/AndroidRuntime(29969): at Android.view.Surface.unlockCanvasAndPost(Native Method)
06-18 15:03:05.853: E/AndroidRuntime(29969): at android.view.SurfaceView$3.unlockCanvasAndPost(SurfaceView.java:793)
06-18 15:03:05.853: E/AndroidRuntime(29969): at com.enhancement.SpecGuageUpdate.run(SpecGuageUpdate.java:313)
そして、313のSpecGugaeupdateで、私は次のことを行っています。
mHolder.unlockCanvasAndPost(canvas);
mHolderは私のSurfaceHolderです。そしてもちろん、onDrawを呼び出す前にキャンバスをロックしました。
このメソッドは、すべての方向にゆっくりと回転させると問題なく機能しますが、2つのランドスケープ状態の間ですばやく180度回転すると、このillegalArgumentExceptionがトリガーされます。surfaceChangedで幅と高さを監視していると、すばやく回転すると、横向きの幅と縦向きの高さが対になっていることに気付きました。たとえば、私の電話(Motorola atrix)では、縦向きの場合は540x307(WidthxHeight)、横向きの場合は960x172のSurfaceViewのサイズです。これは、横向きと逆向きの横向きの間をすばやく回転するとどうなるかです。
ゆっくりと横向きに回転します。
960x172
すばやく回転して風景を反転させます。変更されたサーフェスは2回呼び出されます。
960x307 - 1st
960x172 - 2nd
onMeasureをオーバーライドしようとしましたが、幅と高さはSurfaceChangedのものと同じです。ですから、準備が整っていないキャンバスに描画しようとしているようですが、ホルダーにロックできるように十分に準備ができています。お時間をいただきありがとうございます。
さらに、破壊された表面では、次のようにスレッドを処理しています。
boolean retry = true;
thread.setRunning(false);
while (retry) {
try {
specupdate.join();
retry = false;
} catch (InterruptedException e) {
}
}
これにより、スレッドはonDrawを実行できなくなります。