2011-01-09 7 views
14

MediaPlayer 클래스에서 재생되는 트랙의 길이를 표시하고 트랙 내에서 검색을 사용하려면 SeekBar를 사용하려고합니다.Android SeekBar setProgress로 인해 MediaPlayer가 건너 뜁니다.

트랙 내에서 원활하게 작동합니다. 그러나 트랙이 재생되는 동안 setProgress를 사용하여 진행 값을 업데이트하면 약간의 건너 뛰기가 발생합니다.

onCreate 메서드에서 현재 트랙의 SeekBar 진행률 값을 업데이트하는 루프가있는 스레드를 만듭니다. 트랙이 변경되면이 루프가 재설정됩니다.

private void createProgressThread() { 

    _progressUpdater = new Runnable() { 
     @Override 
     public void run() { 
      //Exitting is set on destroy 
      while(!_exitting) { 
       _resetProgress = false; 
       if(_player.isPlaying()) { 
        try 
        { 
         int current = 0; 
         int total = _player.getDuration(); 
         progressBar.setMax(total); 
         progressBar.setIndeterminate(false); 

         while(_player!=null && current<total && !_resetProgress){ 
          try { 
           Thread.sleep(1000); //Update once per second 
           current = _player.getCurrentPosition(); 
           //Removing this line, the track plays normally. 
           progressBar.setProgress(current); 
          } catch (InterruptedException e) { 

          } catch (Exception e){ 

          }    
         } 
        } 
        catch(Exception e) 
        { 
         //Don't want this thread to intefere with the rest of the app. 
        } 
       } 
      } 
     } 
    }; 
    Thread thread = new Thread(_progressUpdater); 
    thread.start(); 
} 

이상하게도 스레드를 사용하지 않는 것이 이상적입니다. 또한 삼키는 예외를 용서하십시오 - UI 이벤트에 대한 응답으로 모든 MediaPlayer 상태를 계속 확인하는 것은 어렵습니다. 그러나, 나의 진짜 문제는 음악이 건너 뛰고 있다는 것이다.

다른 사람이 진행 상황을 업데이트하고 setProgress에 대한 호출로 인해 별도의 스레드를 사용하여도 건너 뛸 수있는 이유를 설명해 줄 수 있습니까?

미리 감사드립니다.

답변

23

문제는 setProgress()를 호출 할 때 onProgressChanged 이벤트가 발생한다고 생각합니다.

리스너 (OnSeekBarChangeListener)에는 메서드가 있습니다. public void onProgressChanged (SeekBar seekBar, int progress, boolean fromUser). 여기서 리스너가 사용자 조치 또는 코드에 의해 해고되었는지 테스트해야합니다. 귀하의 경우 fromUser 변수는 false 여야합니다.

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    if(fromUser){ 
      player.seekTo(x); 
     } 
     else{ 
     // the event was fired from code and you shouldn't call player.seekTo() 
     } 
} 
+0

스폿이 켜져 있습니다. 고맙습니다. –

+0

BRILLIANT, 광란의 무기력 디버깅 하루 만에이 문제가 발견되었습니다! :) 고맙습니다. – Soham

관련 문제