Handler
은 UI 스레드 (new Handler(Looper.getMainLooper())
을 사용하여 생성됨)에 있으며 응용 프로그램 시작과 동시에 메시지 시퀀스가 전송됩니다 클래스 'onCreate
). 내가 알기로는이 Handler
은 onCreate
의 시간이 될 때까지 메시지를 수신하지 않는 것 같습니다. Activity
. 이 시점 이전에 전송 된 메시지는 손실 된 것처럼 보입니다.UI 스레드 핸들러가 첫 번째 작업 전에 메시지를받지 못합니다. onCreate()
첫 번째 Activity
이 표시 될 때까지 UI 스레드의 Looper
이 아직 메시지를 실행할 준비가되지 않았기 때문에 이것이 발생 했습니까?
난 그냥 아래 의견과 관련하여이 정보를 추가 해요
보충 정보 - 그것은 특정 질문의 일부가 아니다.
이 Handler
은 다양한 장기 실행 작업으로 인해 자신의 버전의 Eclipse IProgressMonitor
을 사용하여 진행 정보가 현재 Activity
에 표시되도록하는 메커니즘의 일부로 사용됩니다.
응용 프로그램이 시작되면 초기화 작업이 수행됩니다. 이 작업은 파일 내용을 기반으로 데이터 구조를 만드는 작업과 관련된 장기 실행 작업입니다. 이 초기화 작업 은 나중에 사용자 조작에 따라 응용 프로그램을 사용하는 동안 나중에 반복해야합니다 ().
이 응용 프로그램에서는 이클립스 플랫폼 API의 클래스를 기반으로 한 아이디어 인 IProgressMonitor
을 구현했습니다. 이를 통해 초기화 작업을 포함하여 응용 프로그램의 다양한 장기 실행 작업을 관리자 클래스에서 IProgressMonitor
으로 잡고 해당 작업의 진행률 업데이트 메서드 (done()
, percentDone()
등)를 호출 할 수 있습니다. Activity
이 표시되면 가시적 진행률 알림이 표시됩니다 (Crouton 라이브러리 사용).
IProgressMonitor의 실제 구현은 Handler
을 사용하여 done()
, percentDone()
등의 업데이트를 UI 스레드로 전송합니다. 그런 다음 관리자 클래스는 Handler
을 통해 업데이트를 가져오고이 표시되고 Activity
이 표시되면 관리자에게 등록 된 것으로 상태 업데이트를 표시합니다 ().
위의 질문에 도달하게 된 원인은 응용 프로그램이 시작될 때 초기화가 처음 발생했을 때 IProgressManager
에 대한 호출이 UI-Thread Handler
을 통해 관리자에게 전달되지 않는 것입니다. 첫 번째 Activity
이 표시됩니다. 기능적 관점에서 볼 때 아무런 의미가 없습니다. Activity
이 보이지 않으면 관리자는 아무 것도 표시 할 수 없기 때문입니다. 그러나 나는 그 원인에 대해서 궁금해하고 있습니다.
감사합니다. 자세한 LogCat 검사 결과 메시지가 손실되었다고 표시되었지만 다시 돌아가서 다시 검사합니다. 관련'Handler'는 실제로'Activity'가 표시되면 간접적으로 UI 업데이트를 발생시킵니다 (주석에서 자세히 설명하기는 어렵지만). 덧붙여 말하자면, UI 업데이트가 아닌 경우 UI 스레드에 'Handler'를 넣지 않는 것에 대해서는 동의하지 않습니다. 어떤 경우에는 장기 실행 작업에서 비동기 알림 콜백을 수행하기에 적합한 주 스레드를 고려해야합니다. 물론 처리기 내에서 '작업'이 수행되지 않는 한. – Trevor
비동기 알림, 예, 동의합니다.그러나 이것은 "이것은 응용 프로그램의 초기화와 관련이 있습니다."이것은 DB 초기화, 생성, 네트워킹 로그, 디스크 캐시로드 등과 관련하여 좀 더 "작업"을 의미 할 수 있습니다. 그러나 당신이 말했듯이, 무엇에 관한 것인지 명확한 설명이 없으면 모범 사례만을 토대로 추측 할 수 있습니다. 그러나 다시 한번, 메시지가 onCreate 활동 후에 수신된다면 어떻게 사라지게 될까요? – Budius
당신 말이 맞아요. 제가 쓴 것은 상당히 오도하고, 사실 거의 모순이었습니다. 방금 관심이있는 경우에 대비하여 세부적인 세부 정보로 질문을 업데이트했습니다. – Trevor