마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AsyncTask 비동기 처리 후 View가 그려지는 시점...

0 추천
안녕하세요. 현재 메인쓰레드에 사각형 4개가 다닥다닥 붙어있는 상태고요.

비동기 처리가 끝나면(onPostExecute에서) 해당 4개 사각형들의 Margin 값을 늘려줍니다. (붙어있던 사각형 4개가 서로 틈이 벌어지게끔, 마진을 주는 방법은  View.setLayoutParams 메서드를 사용하고 있습니다.)

그리고 바로 사각형들의 중심 좌표를 구해서 점을 찍습니다. (getLoctionOnScreen 사용)

 

그런데 이게...onPostExecute 에서 중심점을 찍게되면... setLayoutParams 으로 마진을 주었음에 도 불구하고 마진이 반영되지 않은 상태(다닥다닥 붙어있는상태)의 중심점이 찍히는것 같습니다. 제가 원하는건 사각형 4개가 서로 틈이 약간 벌어진 상태에서의 중심점들을 표시해주고 싶은거거든요.

 

UI Thread에 버튼을 따로 만들어서 중심점 찍는 로직을  넣고 클릭하면..잘 찍힙니다.

다만 onPostExecute  에서 중심점을 찍게되면 마진을 주었음에 도 불구하고  마진이 먹기 전의 중심점이 찎힙니다..

 

느낌상 onPostExecute  에서 UI Thread의 사각형 4개의 마진을 주었으나 실제로는 onPostExecute 가 끝나야 해당 뷰들의  마진이 반영되는 것 같아요..

 

 

비동기처리가 끝나고, 마진을 주고, 마진이 반영된 사각형들의 중심에 점을 찍고 싶습니다.

'여기서 마진이 반영된'의 시점을 잡을 방법이 없을까요? onPostExecute  는 아닌 것 같습니다..

아니면 다른 방법이 있을까요?!
치솟음 (3,710 포인트) 님이 2015년 9월 17일 질문

1개의 답변

0 추천
onPostExecute도 버튼 클릭도 모두 UI thread에서 실행됩니다. 다만 setLayoutParams을 호출하자마자 바로 레이아웃이 처리되지 않습니다. 먼저 내부적으로 requestLayout이 호출되고 그 이후의 메시지 처리에서 실제 레이아웃이 변경됩니다.

일단 seLayoutParams를 onPostExecute에 넣는 것은 맞습니다. 다만 getLocationOnScreen은 onPostExecute에서 바로 호출하면 제대로된 값이 나오지 않겠죠. ViewTreeObserver.OnGlobalLayoutListener나 View.onLayoutChangedListener 등을 통해서 처리해보시기 바랍니다.
회색 (21,340 포인트) 님이 2015년 9월 17일 답변
...