2014-09-02 3 views
0

Handler은 UI 스레드 (new Handler(Looper.getMainLooper())을 사용하여 생성됨)에 있으며 응용 프로그램 시작과 동시에 메시지 시퀀스가 ​​전송됩니다 클래스 'onCreate). 내가 알기로는이 HandleronCreate의 시간이 될 때까지 메시지를 수신하지 않는 것 같습니다. 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이 보이지 않으면 관리자는 아무 것도 표시 할 수 없기 때문입니다. 그러나 나는 그 원인에 대해서 궁금해하고 있습니다.

답변

0

메시지는 사용자가 말한대로 "손실"되지 않으며, 나중에 배달됩니다. 그것은 당신도 여러 개의 Handler 객체를 가지고 있기 때문에 메시지가 갈 대기열은 Lopper 대기열입니다. 활동이 시작되면 Android 시스템은 사용자에게 활동을 표시하기 위해 수행해야하는 모든 작업을 대기열에 추가합니다.

측면에서 : UI와 관련하여 사용하지 않는 UI는 UI에 삽입하지 마십시오! 맞았 어?

일부 옵션은, 그들이 정확히 무슨 일을하는지에 따라 달라질 수 있습니다

  • 사용 게으른 초기화, 의미를, 사용자가 적극적으로 필요 구성 요소 만 처음 init을.

  • UI와 관련이없는 작업을 수행하려면 우선 순위가 낮은 HandlerThread을 작성하십시오. 어쩌면 그것들을 실행하기 전에 전체 UI가 먼저 만들어 지도록 몇 초 동안 지연시킬 수도 있습니다. 귀하의 추가 정보를 기반으로

편집 : 나는이 건물에 복용하고있는 접근 방법과 이유에 대한 조언을하지 않는

이다 : 그것은하지 어떤 핸들러가 있고 안드로이드 프레임 워크입니다 장기 실행 작업에 대한 자체 구현 및 현재 활성화 된 상태로 다시 통신하는 방법

"이 작업은 장기 실행 작업입니다", 장기 실행 작업, 특별히 UI와 관련이없는 작업은 Proba에 Service에 위임하십시오. bly 당신은 HandlerThread을 자동으로 가지고있는 IntentService을 조사해야합니다. 그들은 백그라운드 스레드에서 긴 태스크를 수신 한 순서대로 실행하고 더 이상 아무 것도 실행되지 않으면 자동으로 삭제합니다.

서비스에서 실행중인 진행중인 작업에 대한 업데이트 정보를 얻으려면 두 가지 방법이 있습니다.

1 - 더 복잡하지만보다 완전한 접근 방식으로 서비스에 대한 활동 및 직접 호출 방법은 setListener과 같습니다. 여기에는 일부 ServiceConnection 콜백이 포함되지만 액티비티와 서비스 간의 긴밀한 상호 작용도 허용됩니다. 예를 들어이 진행 업데이트를 보낼 수 있도록,

서비스 코드 : -

이 단순한 단방향 방식은 내가 당신에게 아래의 간단한 예를 보여주지는 LocalBroadcastManager에 파견 업데이트를하고 활동이 음악을들을 수 있도록하는 것입니다 빌드 데이터 구조 작업

Intent i = new Intent(MY_APP_UPDATE); 
i.putExtra("serviceType", BUILDING_DATA_STRUCTURE); 
i.putExtra("updateType", ON_UPDATE); 
i.putExtra("updateValue", progress_percent); 
LocalBroadcastManager.getInstance(this).sendBroadcast(i); 

에 다음 활동에 당신은 당신이 업데이트를 수신하고 onResume/onPause 브로드 캐스트 리시버 내부 클래스를 만듭니다.

private BroadcastReceiver myReceiver = new BroadcastReceiver(){ 
    @Override public void onReceive (Context context, Intent intent){ 

      int serviceType = intent.getIntExtra("serviceType", 0); 
      int updateType = intent.getIntExtra("updateType", 0); 
      int updateValue = intent.getIntExtra("updateValue", 0); 

      // here you can properly handle the updates being sure that your activity isResumed 
    } 
} 

다음 onResume/onPause 당신은

LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, new IntentFilter(MY_APP_UPDATE)); 
LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver); 

등록을 취소/등록 있지만 모든 나는 그들이 다시 이상 무료 약간 더 번거 로움 경향으로 프레임 워크 규칙과 내장 기능 내에서 재생 좋아하기 때문에 바퀴 발명.

+0

감사합니다. 자세한 LogCat 검사 결과 메시지가 손실되었다고 표시되었지만 다시 돌아가서 다시 검사합니다. 관련'Handler'는 실제로'Activity'가 표시되면 간접적으로 UI 업데이트를 발생시킵니다 (주석에서 자세히 설명하기는 어렵지만). 덧붙여 말하자면, UI 업데이트가 아닌 경우 UI 스레드에 'Handler'를 넣지 않는 것에 대해서는 동의하지 않습니다. 어떤 경우에는 장기 실행 작업에서 비동기 알림 콜백을 수행하기에 적합한 주 스레드를 고려해야합니다. 물론 처리기 내에서 '작업'이 수행되지 않는 한. – Trevor

+0

비동기 알림, 예, 동의합니다.그러나 이것은 "이것은 응용 프로그램의 초기화와 관련이 있습니다."이것은 DB 초기화, 생성, 네트워킹 로그, 디스크 캐시로드 등과 관련하여 좀 더 "작업"을 의미 할 수 있습니다. 그러나 당신이 말했듯이, 무엇에 관한 것인지 명확한 설명이 없으면 모범 사례만을 토대로 추측 할 수 있습니다. 그러나 다시 한번, 메시지가 onCreate 활동 후에 수신된다면 어떻게 사라지게 될까요? – Budius

+0

당신 말이 맞아요. 제가 쓴 것은 상당히 오도하고, 사실 거의 모순이었습니다. 방금 관심이있는 경우에 대비하여 세부적인 세부 정보로 질문을 업데이트했습니다. – Trevor

관련 문제