2016-10-02 2 views
0

Ich mache eine Audio-Player-App, möchte ich in der Lage sein, eine Suchleiste aktualisieren, die aktuelle Wiedergabeposition und eine Textansicht zeigt die Zeit zeigt. Ich kann das, aber es gibt ein Problem. Jede Sekunde, wenn die Suchleiste und die Textansicht aktualisiert werden, gibt es eine kleine Verzögerung im Audio. Es ist, als ob es jede Sekunde für eine kurze Zeit pausiert, wenn die Ansichten aktualisiert werden.Android erfrischende Seekbar Fortschritt und Wiedergabedauer in Audio-Player verursacht Verzögerungen in der Audiowiedergabe

Hier ist meine Aktualisierungs Klasse

import android.os.Handler; 
import android.os.Looper; 
import java.util.concurrent.TimeUnit; 
class refreshSeekBar extends Thread{ 

private Handler mainHandler = new Handler(Looper.getMainLooper()); 

@Override 
public void run() { 
    startRefreshingSeekBar(); 
} 

private void startRefreshingSeekBar(){ 
    Global.scheduledFuture = Global.scheduledExecutorService.scheduleWithFixedDelay(new Runnable() { 
     @Override 
     public void run() { 
      long S = Global.mediaPlayer.getCurrentPosition(); 
      S = S/1000; 
      long M = S/60; 
      S = S%60; 
      String SS = ""+S; 
      String MM = ""+M; 
      if((S/10)<1){ 
       SS = "0"+SS; 
      } 
      if((M/10)<1){ 
       MM = "0"+MM; 
      } 
      final String MMM = MM; 
      final String SSS = SS; 
      mainHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        Global.seekBar.setProgress(Global.mediaPlayer.getCurrentPosition()); 
        Global.textCurrentDuration.setText(MMM+":"+SSS); 
       } 
      }); 
     } 
    },0,1000, TimeUnit.MILLISECONDS); 
} 

}

Antwort

1

Ich konnte das Problem lösen. Ich hatte den booleschen Befehl fromUser im OnSeekBarChangeListener der Suchleiste nicht verwendet, um zu verhindern, dass er aufgerufen wird, wenn der Fortschritt programmgesteuert festgelegt wurde. Wann immer der Fortschritt aktualisiert wurde, suchte er den mediaPlayer und damit die Verzögerungen.

+0

Du hast meinen Nachtmann gerettet! –

0

Dies ist, wie ich habe es in meiner app und es läuft ohne Lags, meinen Code konvertiert Millisekunden bis Minuten und Sekunden ohne wenn Anweisungen.

@Override 
    public void run() { 
      currentPosition = mPlayer.getCurrentPosition(); 
      total = mPlayer.getDuration(); 

      while (mPlayer != null && currentPosition < total) { 
       try { 
        Thread.sleep(1000); 
        currentPosition = mPlayer.getCurrentPosition(); 
       } catch (InterruptedException e) { 
        return; 
       } catch (Exception e) { 
        return; 
       } 
       seekBar.setProgress(currentPosition); 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         // This code will always run on the UI thread, therefore is safe to modify UI elements. 
         String currTime = String.format("%02d:%02d", 
           TimeUnit.MILLISECONDS.toMinutes(currentPosition), 
           TimeUnit.MILLISECONDS.toSeconds(currentPosition) - 
             TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(currentPosition)) 
         ); 
         currentPos.setText(currTime); 

        } 
       }); 
      } 
      } 
+0

Danke für die Umstellung der Zeiteinheit ohne die if-Bedingung –