我的UI上有一个SeekBar。更改位置时,我想在TextView中报告其值。在此TextView中,我还想提供一个信息,该位置还有多长时间(以秒为单位)。我以为,Runnable中的run方法将只运行一次,但是每执行一个postDelayed执行,它将运行几次。无论延迟是1s还是10s长。如何强制它只运行一次?我应该打线吗?

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    y=0;
    myHandler.postDelayed(new Runnable(){
    @Override
    public void run(){
           myHandler.postDelayed(this, 1000);
           progressIndicator.setText("Covered: " + progressX.getProgress() + "/" + progressX.getMax() + " position is still for " + y + " seconds");
                    y+=1;
           }
    },1000);
}


编辑:
removeCallbacks有所帮助。该代码可以正常工作,但是仅在第一个progressChange上有效,明天我将尝试解决该问题。

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  y=0;
  myHandler.postDelayed(new Runnable(){
           @Override
           public void run(){
           myHandler.removeCallbacks(this);
           y+=1;
           progressIndicator.setText("Covered: " + progressX.getProgress() + "/" + progressX.getMax() + " position is still for " + y + " seconds");
           myHandler.postDelayed(this, 5000);
           }
   },5000);
 }

最佳答案

问题是,onProgressChanged的每个事件都同时运行新的可运行的。将myHandler.removeCallbacks(runnable)放在run方法中,会产生一些积极效果,并且这是“正确”工作的唯一地方。实际上,y的增加非常快,增加了搜寻条的先前位置和当前位置的差值(postDelayed方法的累加),之后,每秒增加1。 removeCallbacks杀死了先前的postDelayed动作。

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            y=0;
            myHandler.postDelayed(new Runnable(){
                @Override
                public void run(){
                    myHandler.removeCallbacks(runnable);
                    ...
                    y+=1;
                    runnable=this;
                    myHandler.postDelayed(runnable, 1000);
                    }
            },1000);


但是,这就是解决方案,将myHandler.removeCallbacksAndMessages(null)放在onProgressChanged内是有帮助的。
我附上代码以更好地理解。 TextView progressIndicator显示您在搜索栏的当前位置停留了多长时间(以秒为单位)。

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            myHandler.removeCallbacksAndMessages(null);
            y=0;
            progressIndicator.setText("Covered: " + progressX.getProgress() + "/" +
                    progressX.getMax());
            myHandler.postDelayed(new Runnable(){
                @Override
                public void run(){
                    y+=1;
                    progressIndicator.setText("Covered: " + progressX.getProgress() + "/" +
                            progressX.getMax() + " position is still for " + y + " seconds");
                    runnable=this;
                    myHandler.postDelayed(runnable, 1000);

                }
            },1000);

10-06 03:24