如果我取消它,我的计时器不会停止运行! 如果我关闭整个应用程序,Timer只会停止!
我不知道为什么Timer没有被取消。如果我打印出每次取消定时器的尝试我会得到线条的数据但是定时器不会停止!
我的班级:
public class PlayActivity extends AppCompatActivity
implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, MediaplayerEvent {
//region Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Initialize_Layout();
Initialize_Objects();
}
@Override
protected void onResume() {
super.onResume();
MusicService.setMediaPlayerEvent(this);
txvSongtitle.setText(serviceInterface.MP_getActualSong().getTitle());
Start_Timer();
}
@Override
protected void onPause() {
timer.cancel();
MusicService.clearMediaPlayerEvent();
super.onPause();
}
@Override
public boolean onSupportNavigateUp() {
finish();
return super.onSupportNavigateUp();
}
//endregion
//region Methods
private void Start_Timer() {
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (serviceInterface.MP_isPlaying()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
seekBar.setMax(serviceInterface.MP_getDuration());
seekBar.setProgress(serviceInterface.MP_getCurrentPosition());
}
});
}
else {
runOnUiThread(new Runnable() {
@Override
public void run() {
timer.cancel();
}
});
}
}
}, 0, 200);
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
serviceInterface.MP_seekTo(progress);
Start_Timer();
}
}
//endregion
}
我希望你能帮助我! 谢谢!
答案 0 :(得分:0)
您正在创建并启动用户移动搜索栏的新计时器(在onProgressChanged()
中)。这也意味着你失去了对旧的参考。当isPlaying变为false时,所有计时器都会尝试取消timer
- 仅引用最新的计时器。
答案 1 :(得分:0)
我建议使用Thread
代替计时器。您的Start_Timer()
代码将更改为以下内容:
private Thread mTimerThread;
...
private void Start_Timer() {
mTimerThread = new Thread() {
@Override
public void run() {
try {
while (!isInterrupted()) {
if (serviceInterface.MP_isPlaying()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
seekBar.setMax(serviceInterface.MP_getDuration());
seekBar.setProgress(serviceInterface.MP_getCurrentPosition());
}
});
} else {
interrupt();
}
Thread.sleep(200);
}
} catch (InterruptedException e) {
}
}
}
mTimerThread.start();
}
线程更高效,更轻便,完美满足您的需求。另外,通过将Thread设置为全局变量,您可以确保在Android生命周期事件期间调用mTimerThread.interrupt();
,例如onPause()
。
我希望这可以解决您的问题。请记住,Java Thread
是你的朋友!