我目前有一个进度条可以跟踪音乐文件的进度,但是在不同的方向上它似乎不想更新并且只是停留在之前的位置?
private ProgressBar musicProgress;
private int updateIncrement;
private int duration;
private int progress;
private int progressUpdate;
Timer timer = new Timer();
TimerTask timerTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_current_music);
if (savedInstanceState != null)
{
progressUpdate = savedInstanceState.getInt("PROGRESS");
duration = savedInstanceState.getInt("Duration");
updateIncrement = savedInstanceState.getInt("Update");
musicProgress = findViewById(R.id.p_musicProgress);
musicProgress.setMax(duration);
timer.scheduleAtFixedRate(timerTask = new TimerTask(){
@Override
public void run() {
musicProgress.setProgress(progressUpdate);
}
}, 0, updateIncrement);
}
}
@Override
public void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putInt("PROGRESS", progressUpdate);
outState.putInt("Update", updateIncrement);
outState.putInt("Duration", duration);
}
public void onPlayClick (View v)
{
Log.d("MP3 Player", "Music Play button pressed");
if(player.getState() == MP3Player.MP3PlayerState.PAUSED)
{
player.play();
}
else if(player.getState() == MP3Player.MP3PlayerState.PLAYING)
{
player.pause();
}
else
{
player.load(musicURL, playbackspeed);
updateIncrement = player.getDuration()/100;
duration = player.getDuration();
musicProgress = findViewById(R.id.p_musicProgress);
musicProgress.setMax(duration);
timer.scheduleAtFixedRate(timerTask = new TimerTask(){
@Override
public void run() {
progress = player.getProgress();
progressUpdate = progress;
musicProgress.setProgress(progressUpdate);
}
}, 0, updateIncrement);
}
}
问题可能是我在计时器内设置了progress=player.getProgress(),所以即使在活动被销毁并再次创建之后,它也会尝试在内部传递旧值并继续,但随后该值会在活动之前发生变化。设置进度?
此时我真的很困惑
我也知道player.getProgress()的冗余分配我希望使用不同的变量将允许它改变但无法让它工作
您的
progress
仅在onPlayClick()
中启动的计时器中更新,并且这只更新视图中的变量,这些变量在重新创建视图时会丢失。作为快速修复,您可以检查状态是否正在播放并在 onCreate
方法中启动新的计时器。但是,首选方法是将状态与视图解耦,并使用 ViewModel 在整个视图的生命周期中保留和保留数据。