我的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);