2013-07-12 69 views
0

我有一个应用程序,使用android媒体播放器MIDI文件播放。我制作了一个textview作为计时器,它将根据播放进度动态改变。然而,这是非常错误,因为它成为停留在2秒大关Android的Buggy媒体播放定时器

class progressTrack extends AsyncTask<String,Void,String>{ 

      @Override 
      protected String doInBackground(String... arg0) { 
       ToggleButton mStartStop; 
       int currentPosition=0; 
       int total=mediaPlayer.getDuration(); 
       TextView timer=(TextView) findViewById(R.id.timer); 
       while (mediaPlayer != null && currentPosition < total) { 
        try { 
         Thread.sleep(1000); 
         currentPosition = mediaPlayer 
           .getCurrentPosition(); 
         double seconds=currentPosition/1000; 
         int time= (int) Math.round(seconds); 
         String timeS=Integer.toString(time); 
         Log.d("Time",timeS); 
         timer.setText(timeS+"s"); 
         fSlider.setProgress(currentPosition); 
        } catch (InterruptedException e) { 

        } catch (Exception e) { 

        } 
        OnSeekBarChangeListener listener = new OnSeekBarChangeListener() { 
         public void onStopTrackingTouch(SeekBar seekBar) { } 
         public void onStartTrackingTouch(SeekBar seekBar) { } 
         public void onProgressChanged(SeekBar seekBar, 
           int progress, 
           boolean fromUser) { 
          if(fromUser) 
           mediaPlayer.seekTo(progress); 
         } 
        }; 
        fSlider.setOnSeekBarChangeListener(listener); 
       } 

的时间确实在logcat中正确显示,但为什么不会改变它在TextView的?

解决:

protected void onPostExecute(String result) { 

       ScheduledExecutorService myScheduledExecutorService = Executors.newScheduledThreadPool(1); 
       myScheduledExecutorService.scheduleWithFixedDelay(
         new Runnable(){ 
          @Override 
          public void run() { 
           monitorHandler.sendMessage(monitorHandler.obtainMessage()); 
          }}, 
            200, //initialDelay 
            200, 
            TimeUnit.MILLISECONDS//delay         TimeUnit.MILLISECONDS 
         );                       
      }   
} 

Handler monitorHandler = new Handler(){ 

     @Override 
     public void handleMessage(Message msg) { 
     startUI(); 
     } 

}; 

void startUI(){ 
     Log.d("UI", "Started player UI"); 
     ToggleButton mStartStop; 
     int currentPosition=0; 
     int total=mediaPlayer.getDuration(); 
     TextView timer=(TextView) findViewById(R.id.timer); 
     if(mediaPlayer.isPlaying()) 
      try { 
       currentPosition = mediaPlayer 
         .getCurrentPosition(); 
       double seconds=currentPosition/1000; 
       int time= (int) Math.round(seconds); 
       String timeS=Integer.toString(time); 
       timer.setText(timeS+"s"); 
       Log.d("position",timeS); 
       fSlider.setProgress(currentPosition); 
      } catch (Exception e) { 

      } 
      OnSeekBarChangeListener listener = new OnSeekBarChangeListener() { 
       public void onStopTrackingTouch(SeekBar seekBar) { } 
       public void onStartTrackingTouch(SeekBar seekBar) { } 
       public void onProgressChanged(SeekBar seekBar, 
         int progress, 
         boolean fromUser) { 
        if(fromUser) 
         mediaPlayer.seekTo(progress); 
       } 
      }; 
      fSlider.setOnSeekBarChangeListener(listener); 

     mStartStop= (ToggleButton) findViewById(R.id.toggleButton1); 
     mStartStop.setOnCheckedChangeListener(pauseListener); 

} 

回答

0

你需要做的这一个单独的线程,并通过runOnUiThread回发到GUI线程与runnable设置你的计时器的文字。正如你大概设置一个GUI组件的文本无一例外,我认为你现在没有这样做。

请发表完整的方法。用完整的方法,我们可以帮助追踪为什么它停在2秒的标记。

+0

我刚贴完全班 – StephenChen