2016-11-05 1 views
1

Ich entwickle einen einfachen Musik-Player. Es gibt also eine SeekBar, die vom Thread aktualisiert wird. Aber wenn ich einen Song zum zweiten Mal wähle, stürzt er ab (java.lang.IllegalThreadStateException: Thread ist bereits gestartet).java.lang.IllegalThreadStateException: Thread bereits gestartet

Dies ist mein Code:

updateSeekBar = new Thread(){ 
    @Override 
    public void run(){ 
     int totalDuration = mp.getDuration(); 
     int currentPosition = 0; 
     while(mp != null && currentPosition<totalDuration){ 
      try{ 
       sleep(500); 
       currentPosition = mp.getCurrentPosition(); 
       sb.setProgress(currentPosition); 
      }catch (InterruptedException e){ 
       Log.i(TAG, "Thread ERROR"); 
       e.printStackTrace(); 
      } 
     } 

    } 
}; 

...

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        //Log.i(TAG, "Thread State: " + updateSeekBar.getState().toString()); 
        Uri u = Uri.parse(songList.get(position).getPath().toString()); 
        if(mp!=null){ mp.stop(); mp.reset(); mp.release(); } 
        mp = MediaPlayer.create(getApplicationContext(), u); 
        mp.start(); 
        sb.setMax(mp.getDuration()); 
        updateSeekBar.start(); 
        sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ 
         @Override 
         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){ 

         } 

         @Override 
         public void onStartTrackingTouch(SeekBar seekBar){ 


         } 

         @Override 
         public void onStopTrackingTouch(SeekBar seekBar){ 
          mp.seekTo(seekBar.getProgress()); 
         } 
        }); 

Wie könnte ich den Absturz zu vermeiden?

Antwort

1

Verwenden Sie keine Thread für diese Art von Aufgabe. Jede Ansicht hat einen Handler. Sie können es verwenden, um eine Runnable mit Verzögerung zu posten, die Ihre Suchleiste aktualisiert. Z.B.

public class MyUpdater implements Runnable { 

    MediaPlayer mp; 
    SeekBar sb; 

    public MyUpdater(MediaPlayer mp, SeekBar sb) { 
     this.mp = mp; 
     this.sb = sb; 
    } 

    @Override 
    public void run(){ 
    int totalDuration = mp.getDuration(); 
    int currentPosition = mp.getCurrentPosition(); 
    if (currentPosition<totalDuration) { 
     sb.removeCallbacks(this); 
     return; 
    } 
    sb.setProgress(currentPosition); 
    sb.postDelayed(this, 500); 
    } 
} 

Halten MyUpdater als Mitglied,

final MyUpdater mUpdater; 

und onItemClick tun nur

sb.removeCallbacks(mUpdater); 
mUpdater = new MyUpdater(mp, sb); 
sb.post(mUpdater); 
+0

logcat: Fehler: (118, 23) Fehler: kann nicht Symbol Methode removeAllCallbacks (MyUpdater) – xRobot

+0

es ist 'removeCallbacks' finden. Ich bearbeitete meine Antwort – Blackbelt

+0

Fehler: (9, 8) Fehler: MyUpdater ist nicht abstrakt und überschreibt nicht abstrakte Methode run() in Runnable – xRobot

1

Sie haben Zustand des Threads zu überprüfen, bevor es beginnt.

if (thread.getState() == Thread.State.NEW) { 
      thread.start(); 
} 
Verwandte Themen