java.lang.IllegalThreadStateException:线程已经启动

时间:2016-11-05 10:56:15

标签: java android multithreading

我正在开发一个简单的音乐播放器。所以有一个由Thread更新的SeekBar。但是当我第二次选择一首歌时,它会崩溃(java.lang.IllegalThreadStateException:Thread已经启动)。

这是我的代码:

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

我怎样才能避免崩溃?

2 个答案:

答案 0 :(得分:1)

  

我怎样才能避免崩溃?

请勿使用Thread进行此类任务。每个视图都有一个Handler。您可以使用它来发布具有更新搜索栏的延迟的runnable。 E.g。

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

答案 1 :(得分:1)

您必须在启动之前检查该线程的状态。

<input type="file" id="uploadImage" name="termek_file" class="file_input" multiple/>
<div id="result" class="uploadPreview">