Android UI 스레드 메시지 큐 디스패치 순서
구성 변경 중에 AsyncTask를 유지하기 위해 Android에서 리 테인 프래그먼트로 작업하는 동안 이것이 최선의 접근 방식이라고 생각하지만 UI 스레드의 메시지 큐 호출 순서에 대해 내 마음에 몇 가지 의심이 나타납니다.
예 : 다음 시나리오를 상상해보십시오.
- 구성 변경이 발생하면 사용자가 장치를 회전합니다. AsyncTask가 실행 중입니다.
- 조각
onDetach()
이 호출됩니다. - AsyncTask
doInBackground()
메서드 완료 - AsyncTask
onPostExecute()
가 호출됩니다. - 조각
onAttach()
이 호출됩니다.
따라서 UI 스레드 메시지 큐는 다음과 같을 수 있습니다.
대기열 상단-> onDetach () | onPostExecute () | onAttach ()
내가 아는 onPostExecute()
한 구성 변경이 완료 될 때까지에 대한 호출 이 대기 할 수 없다는 것을 알고 있지만 어떻게 작동합니까? 활동, 조각 라이프 사이클의 호출이 연속적으로 실행됩니까?
것은 불가능하다 onPostExecute()
사이에서 호출 할 수 Fragment#onDetach()
및 Fragment#onAttach()
구성 변경시. 이 주장의 근거는 세 가지입니다.
구성 변경은 기본 스레드의 메시지 대기열에있는 단일 메시지 내에서 처리됩니다.
doInBackground()
메서드가 반환 되는 즉시 주 스레드의 메시지 대기열에 메시지를 게시하여 주 스레드에서 호출 될 메서드를AsyncTask
예약합니다onPostExecute()
.구성 변경 메시지에는
Activity
및Fragment
수명주기 메서드 (예 :onDetach()
andonAttach()
)를 호출하는 코드가 포함됩니다 .AsyncTask
의 메시지는 호출하는 코드를 포함 할onPostExecute()
방법을. 주 스레드는 메시지 대기열의 메시지를 순차적으로 처리하기 때문에 두 메시지를 동시에 실행할onPostExecute()
수 없으므로onDetach()
및에 대한 호출 사이에서 호출 할 수 없습니다onAttach()
.
더 자세한 설명 은 이 스레드 에서 Doug Stevenson에 대한 저의 답변을 읽어보십시오 (클레임을 증명하는 소스 코드에 대한 링크 포함).
참고 URL : https://stackoverflow.com/questions/19964180/android-ui-thread-message-queue-dispatch-order
'Program Tip' 카테고리의 다른 글
Phonegap과 Sencha Touch의 차이점 (0) | 2020.12.11 |
---|---|
C ++에 128 비트 정수가 있습니까? (0) | 2020.12.11 |
R3.3 용 udunits2 패키지 설치 (0) | 2020.12.11 |
ListBox 항목에 대한 DataTemplate의 IsSelected에 대한 WPF 트리거 (0) | 2020.12.11 |
gcov 기호는 어디에 있습니까? (0) | 2020.12.11 |