我正在开发一个简单的音乐播放器。所以有一个由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());
}
});
我怎样才能避免崩溃?
答案 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">