2016-11-05 171 views
1

我正在開發一個簡單的音樂播放器。所以有一個由線程更新的SeekBar。但是當我第二次選擇一首歌時,它會崩潰(java.lang.IllegalThreadStateException:線程已經啓動)。java.lang.IllegalThreadStateException:線程已經啓動

這是我的代碼:

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()); 
         } 
        }); 

我怎麼能避免撞車?

回答

1

How could I avoid the crash ?

對於這類任務不使用Thread。每個視圖都有一個處理程序。您可以使用它來延遲更新您的搜索欄來發布可運行的代碼。例如。

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); 
    } 
} 

保持MyUpdater作爲成員,

final MyUpdater mUpdater; 

onItemClick只是做

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

logcat的:錯誤:(118,23)錯誤:無法找到符號方法removeAllCallbacks(MyUpdater) – xRobot

+0

它是'removeCallbacks'。我編輯我的答案 – Blackbelt

+0

錯誤:(9,8)錯誤:MyUpdater不是抽象的,並且不重寫抽象方法run()在Runnable中 – xRobot

1

你開始之前,檢查該線程的狀態。

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