2

Matrix を使用して、画面上で PNG 画像を回転させています。UIスレッドに負荷がかからないように、回転操作を別のスレッドに移動したい。しかし、これはいくつかの興味深い疑問を提起します。

Matrix が ImageView に適用されたら、invalidate() を呼び出す必要があると予想していました。ただし、回転した画像は画面上で問題なく表示されます。また、invalidate() を呼び出すことはありません。タッチ領域はありません。UI に画面を更新するように明示的に指示することはありません。表示を更新するために UI スレッドを刺激しているのは何ですか? IT はディスプレイの一部であるオブジェクトに触れるスレッドであるため、UI スレッドは、ディスプレイを更新する必要があることを魔法のように「認識」していますか (したがって、invalidate() への明示的な呼び出しは必要ありません)。

回転を UI スレッドの外に移動すると、UI が画面のレンダリングに使用するのと同じ ImageView を操作します。これは、同期を必要とする古典的なスレッド競合の問題のように思えます (同じオブジェクトが複数のスレッドによってアクセスされるため)。しかし、上記の動作のため、これがどのように処理されるかわかりません。UIスレッドは画面を更新する必要があることを「魔法のように知っている」ように見えるので、同期する必要がありますか?それとも、別のスレッドがビューでinvalidate()を呼び出すだけでそれが処理されますか?

ありがとう!

4

2 に答える 2

0

invalidate を呼び出す必要がなかった理由はsetImageDrawable、ImageView の (および同様のメソッド) メソッドが既にそれ自体を無効にしているためです。

さらに、ビューを別のスレッドで変更するのはお勧めできません。ビュー操作を に移動しonPostExecute、ビットマップ操作を に残しdoInBackgroundます。

于 2013-07-15T16:01:30.270 に答える