2010-08-20 4 views
2

나는 이것에 대해 정말 혼란 스러워요,하지만 난 내 서피스 뷰 SurfaceView에서 스레드를 트리거링을하고있을 때, 메신저이스레드를 실행할 때 Handler는 어떤 작업을 수행합니까?

private static Thread thread; 

public SurfaceView(Context localContext) { 
     //other stuff 
     thread = new Thread(mySurfaceHolder, myEngine, this, new Handler()); 
     //other stuff 
} 

처럼 내 스레드 클래스의 생성자와 핸들러를 보내는 나는 핸들러 객체를 할당 내보기에서 보낸 처리기는 다음과 같습니다.

public Thread (SurfaceHolder lHolder, 
    Engine lEngine, 
    View lView, 
    Handler lHandler){ 

    surfaceHolder = lHolder; 
    engine = lEngine; 
    view = lView; 
    handler = lHandler; 

} 

그래서이 처리기는 무엇을 수행합니까? 어떤 방식 으로든 스레드 클래스에서 사용하지 않습니다. 웹상의 예제에서 생성자와 함께 처리기를 보내야한다는 것을 아직도 보여주는 이유는 무엇입니까? 연결을 볼 수 없습니다. Handler docs에서

답변

3

Thread 클래스의 핸들러를 사용하는 생성자가 없으므로 코드에서 Thread를 확장한다고 가정합니다. 안드로이드 스레딩 모델은 특별한 전용 스레드에서 UI 작업을 수행해야하기 때문에 핸들러는 UI 스레드로 다시 통신하는 데 사용됩니다.

새 스레드를 만들 때 코드는 백그라운드 스레드에서 실행되므로 UI ​​작업이 안전하지 않습니다. UI 관련 작업을 수행 할 필요가 없다면 핸들러를 제거 할 수 있습니다.

Android API 3 이후에는 배경과 UI 간의 통신을보다 쉽게하고 처리기 사용을 완화하는 AsyncTask이 있습니다.

예 : 핸들러를 사용하는 예를 들어

  • 는 는 this 참조.
  • 스레딩을 사용하는 샘플 프로젝트에 대한 링크가 들어있는 Painless Threading도 참조하십시오.
+0

Okey. Thread-class는 물론 Thread를 확장합니다. :) 당신은 더 나은 지식을 위해서 UI와 관련된 어떤 일도 할 수 있습니까? – Curtain

+0

@Julien Assange : 예제 편집을 참조하십시오. – JRL

+0

자, 예를 들어 이것은 (게임 코딩 관점에서) 핸들러의 도움으로 점수를 업데이트하는 방법입니다. – Curtain

5

:

프로세스가 응용 프로그램에 대해 생성됩니다

, 주요 스레드 (활동, 방송 수신기 최상위 응용 프로그램 개체를 관리 돌봐 메시지 큐를 실행하기 위해 최선을 다하고 있습니다, 등) 및 창을 만들 수 있습니다. 자신 만의 스레드를 만들고 Handler를 통해 기본 응용 프로그램 스레드와 다시 통신 할 수 있습니다. 이전과 같은 post 또는 sendMessage 메소드를 호출하지만 새 스레드에서 호출하면됩니다. 지정된 Runnable 또는 Message는 Handler의 메세지 큐에 스케줄되어 적절한 때에 처리됩니다.

UI 스레드에서 엄격하게 실행되어야하는 코드를 실행해야하는 경우 일반적으로 스레드에서 UI로 다시 통신해야합니다.

+0

Okey,하지만 난 (내 응용 프로그램에서) 이것을 사용하지 않아? 그리고 어떤 종류의 코드를 UI에서 실행하려면 핸들러가 필요합니까? – Curtain

+0

예를 들어 토스트 및 대화 상자는 UI 스레드에서만 표시 할 수 있습니다. 다른 경우가있을 것입니다. –

2

기본 활동에서 처리기를 전역으로 정의하면됩니다.

Handler mUIHandler = new Handler(); 

그리고 지금 즉시 mUIHandler에 게시 할 수 있으며 항상 UI 스레드로 이동합니다.

+0

나는 이것이 어떻게 유용 할 수 있을지 전혀 모른다. 어떤 상황에서? 미안 해요,하지만 이걸 전혀 얻지 못했습니다. :-) – Curtain

+0

아무런 문제 없어요, 정말 마음이 멍청하네요. 물건을 다운로드하는 스레드가 있다고 가정 해보십시오. 그 물건을 표시하려면 다운로더 스레드가 화면에 물건을 표시 할 수 있습니다. 그렇게하려면 메인 UI 스레드에 변경 사항을 게시해야하며 다운로더 스레드에서 변경 사항을 적용 할 수 없습니다. 그게 도움이 되니? –

+0

다시 말해, Handler는 사용자가 게시 한 "실행 파일"을 실행합니다. 그것은 메인 UI 스레드에서 그렇게합니다. 예를 들어 화면의 텍스트 또는 진행률 막대를 업데이트하는 runnable을 정의합니다. 핸들러는 해당 실행 파일을 받아 들여 실행합니다. UI 스레드는 사용자 경험에 영향을 미치므로 UI ​​스레드가 너무 많으면 사용자 경험에 해가됩니다. –

관련 문제