2013-07-15 4 views
1

Matrix를 사용하여 화면에서 PNG 이미지를 회전합니다. UI 스레드에 부담을주지 않도록 회전 작업을 별도의 스레드로 옮기고 싶습니다. 그러나 이것은 흥미로운 질문을 제기합니다.Android : 언제 invalidate()를 호출할까요?

매트릭스가 ImageView에 적용되면 invalidate()를 호출해야 할 것으로 예상됩니다. 그러나, 회전 된 이미지가 화면에 잘 표시됩니다 - 나는 결코 invalidate()를 호출합니다. 터치 영역이 없으며 UI를 화면에 새로 고침 할 것을 명시 적으로 알려주지 않습니다. 디스플레이를 업데이트하기 위해 UI 스레드를 자극하는 것은 무엇입니까? UI 스레드가 디스플레이가 업데이트되어야한다는 것을 "알기"때문에 마술처럼 "invalidate()"에 대한 명시 적 호출이 필요하지 않습니다.) IT가 스레드가 디스플레이의 일부인 객체를 만지기 때문에?

UI 스레드에서 회전을 이동할 때 UI가 화면을 렌더링하는 데 사용하는 것과 동일한 ImageView를 조작하게됩니다. 이것은 동기화가 필요한 고전적인 스레드 충돌 문제처럼 들립니다 (동일한 객체가 여러 스레드에 의해 액세스 될 것이기 때문에). 그러나 위의 행동 때문에, 어떻게 처리되는지 잘 모르겠습니다. UI 스레드가 화면을 업데이트해야한다는 것을 "마술처럼"알기 때문에 동기화 할 필요가 있습니까? 아니면 별도의 스레드가 View에서 invalidate()를 호출하고 처리하게됩니까?

감사합니다.

답변

2

나는 UI 스레드에서 invalidate() 일 때와 달리 UI가 아닌 스레드에서 postInvalidate()이라고 생각합니다.

예.

그냥 부르면 다음 기회에 업데이트됩니다.

0

무효화를 호출 할 필요가 없었던 이유는 ImageView의 setImageDrawable (및 유사한 메서드) 메서드 자체가 이미 무효화 되었기 때문입니다.

또한보기를 별도의 스레드에서 수정하는 것은 좋지 않습니다. 보기 조작을 onPostExecute으로 이동하고 비트 맵 조작을 doInBackground에 그대로 두십시오.

+0

예, UI가 아닌 스레드 (고전적인 스레드 충돌)에서보기를 조작하는 것은 좋지 않다고 생각했습니다. 일반적으로 이러한 상황에 대해 여러 스레드를 동기화하지만 이상한 자체 무효화 동작으로 인해이 UI 상황에 대한 "특수 규칙"이 있는지 궁금해졌습니다. 나는 onPostExecute와 doInBackground에 익숙하지 않지만 연구 할 것이다. 그것은 나에게 별도의 ImageView를 별도의 스레드에서 변경 한 다음 다른 ImageView에 스왑해야하므로 스레드간에 번갈아 사용하는 두 개의 ImageView가 필요합니다. – AndroidNewbie