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 |