防止SeekBar和计时器在暂停时重置

时间:2017-07-10 09:52:41

标签: java android timer seekbar

我有一个seekBar以及一个简单的音乐播放应用程序的当前计时器和总时间textViews。当我暂停我的音乐时,getDuration和getCurrentPosition都返回0,这就是当前时间和总时间文本都变为0并且seekBar也重置为开头的原因。当我恢复时,一切都会回到原来的状态,就像没有问题一样。为什么getDuration和getCurrentPosition在暂停时返回0?有解决方法吗?

我试图通过设置可见性来创建一个jank解决方案并创建一组新的两个textViews和seekBar来保存时间和seekBar就在暂停之前暂时显示,但那些很笨拙而且有延迟所以我仍然看到重置项目一瞬间。我只用一个按钮处理播放和暂停。如果需要任何其他信息,请告诉我。下面是我的seekBar处理方法,这两种方法都在onCreate中调用:

/**
 * SeekBar setup and handling
 * TODO: Bug where seekBar sets to 0 when paused. Retains position when resumed.
 */
private void initializeSeekBar() {
    seekBar = (SeekBar) findViewById(R.id.seekBar);
    totalDuration = new TextView(this);
    totalDuration = (TextView) findViewById(R.id.totalDuration);
    currentDuration = new TextView(this);
    currentDuration = (TextView) findViewById(R.id.currentDuration);

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(final SeekBar seekBar, int progress, boolean fromUser) {
            if (fromUser && musicBound) {
                // update current time on change
                currentDuration.setText(convertedTime(progress * 1000));
                // update seekBar
                seekTo(progress * 1000);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            musicService.mutePlayer();
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            musicService.unMutePlayer();
            seekTo(getCurrentPosition());
        }
    });
    // start seekBar updating thread
    run();
}

/**
 * Thread that updates seekBar as song plays
 */
@Override
public void run() {
    updateMetadataDisplay();

    if (musicBound) {
        long totalTime = getDuration();
        long currentTime = getCurrentPosition();

        seekBar.setMax(getDuration() / 1000);
        seekBar.setProgress(getCurrentPosition() / 1000);

        // timers
        totalDuration.setText(convertedTime(totalTime));
        currentDuration.setText(convertedTime(currentTime));
    }
    handler.postDelayed(this, 1000);
}

1 个答案:

答案 0 :(得分:0)

我认为这是一个系统错误。我只是通过在getCurrentPosition()输出0时不更新seekBar来做一个解决方法。

run()中的示例:

    if (musicBound) {
      long totalTime = getDuration();
      long currentTime = getCurrentPosition();

      if(currentTime == 0)
        return;

      seekBar.setMax(totalTime / 1000);
      seekBar.setProgress(currentTime / 1000);

      // timers
      totalDuration.setText(convertedTime(totalTime));
      currentDuration.setText(convertedTime(currentTime));
    }