【问题标题】:Prevent SeekBar and timers from reset on pause防止 SeekBar 和计时器在暂停时重置
【发布时间】:2017-07-10 09:52:41
【问题描述】:

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

我试图通过将可见性设置为消失并创建一组新的两个 textView 和 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);
}

【问题讨论】:

    标签: java android timer seekbar


    【解决方案1】:

    我认为这是一个系统错误。当 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));
        }
    

    【讨论】:

    • 我试过了,它导致 seekBar 根本无法启动,因为当前时间必须在歌曲开头为 0
    • @tiandrew 也许数一数你这样做的频率,并且只允许一次。所以添加一个像boolean started = false; 这样的变量,然后在第一次执行run() 方法时将其设置为true,并将if(currentTime == 0) 更改为if(currentTime == 0 && started)注意:您必须在 if(current... 之后将 started 设置为 true
    • 这设法保存了 seekBar 位置和计时器,但现在它不会恢复移动并更新我恢复的时间。当你在一个线程中返回时,你是否必须以某种方式重新启动它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多