2016-11-05 8 views
1

私は単純な音楽プレーヤーを開発しています。したがって、スレッドによって更新されるSeekBarがあります。しかし、2回目の曲を選択すると、クラッシュします(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); 
    } 
} 

だけ

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

logcatエラー:(118、23)エラー:それは 'removeCallbacks'あるシンボル方法removeAllCallbacks(MyUpdater) – xRobot

+0

を見つけることができません。 – Blackbelt

+0

エラー:(9,8)エラー:MyUpdaterは抽象ではなく、抽象メソッドrun()をRunnableでオーバーライドしません – xRobot

1

を行うあなたはそれを開始する前に、そのスレッドの状態をチェックする必要が

final MyUpdater mUpdater; 

onItemClick、メンバーとしてMyUpdaterしてください。

if (thread.getState() == Thread.State.NEW) { 
      thread.start(); 
} 
関連する問題