2011-08-14 4 views
0

내 UI가 느려지지 않도록 별도의 스레드에서 TextView를 업데이트하려고합니다. 그것은 작동하지만, 그것을 제어하기 위해 while 루프를 추가하면 프로그램이 검은 색 화면에 멈 춥니 다.핸들러/Runnable이 루프와 함께 작동하지 않습니다.

코드 :

handler.post(new Runnable(){ 
      @Override 
      public void run() { 

      while(media[6].isPlaying()) { 

      TextView myText = (TextView)findViewById(R.id.timerT); 

      myText.setText(getTimeString(media[1].getCurrentPosition()));   


      handler.postDelayed(this,10); 
             } 
     } 

    }); 

나는 실행 가능한이 일어나지 않을 것이라는 점을 의미하는 새 스레드를 생성하는 생각? 아니면 나쁘게 잘못 될까?

+1

그것은 주 스레드에서 실행됩니다. 'Runnable'은 단지 인터페이스 일뿐입니다 ... 구현할 때 작성한 코드 이외의 숨겨진 코드는 포함하지 않습니다. – mibollma

답변

0

이벤트 디스패치 스레드에서 루프하는 동안 임의의 지속 기간을 실행 중이기 때문에 검은 색 화면이 표시됩니다. 이런 종류의 경우 AsyncTask를 사용하거나 별도의 스레드에서 Runnable을 시작한 다음 View.post를 사용하여 타이머 업데이트 만 보내려합니다. 다음과 같은

1

사용 CountDownTimer 클래스 : 당신이`Handler`를 사용하여`Runnable`을 게시 할 때

// Function arguments are in milliseconds. 
CountDownTimer timer = new CountDownTimer(6000, 1000) { 

    public void onTick(long millisUntilFinished) { 
     //mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 

     // Do your stuff here. 

     TextView myText = (TextView)findViewById(R.id.timerT); 

     myText.setText(getTimeString(media[1].getCurrentPosition())); 
    } 

    public void onFinish() { 
     mTextField.setText("done!"); 
    } 
} 

timer.start(); 
관련 문제