2013-06-13 4 views
1

TimerTask가 스레드로 어떻게 작동하는지 궁금합니다.Android에서 TimerTask는 스레드를 어떻게 관리합니까?

예를 들어 UI 스레드에서 실행되는 '실행'메소드가있는 TimerTask를 실행하는 코드가 있습니다.

class looper extends TimerTask { 

    public looper() { 

    } 

    public void run() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       timer.schedule(new looper(), new Date(new Date().getTime() + 100)); 
      } 
     }); 
    } 
} 

타이머는 다음과 같이 시작합니다 :

timer = new Timer(); 
    timer.schedule(new looper(), new Date()); 

은 TimerTask를 새로운 스레드를 만들 것인가? 그렇다면 runOnUiThread은 어떻게 작동합니까? 코드를 UI 스레드로 옮길 것인가?

TimerTask (timer.schedule)를 다시 호출하고 run 내부의 무한 루프를 사용하여 계산하지 않아도되지만 UI 스레드가 차단되어 앱이 응답하지 않습니다.

P.S - UI를 업데이트해야하기 때문에 UI 스레드에서 코드를 실행해야합니다.

여기에 무슨 일이 발생합니까? 귀하의 질문에 대해

답변

2

:

  • runOnUiThread 문서에서는 :

    는 UI 스레드에서 지정된 작업을 실행합니다. 현재 스레드가 UI 스레드 인 경우 작업이 즉시 실행됩니다. 현재 스레드가 UI 스레드가 아닌 경우, 작업은 UI 스레드의 이벤트 대기열에 게시됩니다.

  • TimerTask의 코드는 다른 스레드에서 실행되므로 코드를 실행하려면 runOnUiThread으로 전화해야합니다.

제대로하고 있지만 왜 run 메소드에서 timertask를 다시 작성하고 있습니까? scheduleAtFixedTime을 사용하는 것을 고려하면 100은 마침표와 지연 0이됩니다. 그러면 run 메소드가 수행해야 할 작업을 실행합니다.

scheduleAtFixedTime

runOnUiThread(new Runnable() { @Override public void run() { //do whatever } }); 
* 업데이트 : handler.postDelayed를 사용하는 것이 더 나은 뷰에 대한 업데이트는 example here가 UI 스레드에 지연 후 실행됩니다 참조의 경우

.

+0

전체 코드를 게시하지는 않았지만 다음 timertask가 실행될 때 제어해야하므로 타이머를 다시 설정해야합니다. – Roman

+0

새 스레드와 UI 스레드간에이 컨텍스트 전환을 피할 수있는 방법이 있습니까? – Roman

+0

답변을 업데이트했습니다. – AlexBcn

관련 문제