在Timer的scheduleAtFixedRate完成之前,TextView.setText被阻塞

时间:2015-02-18 19:08:59

标签: android timer

很抱歉这个尴尬的标题,我不知道如何更清楚地描述我的问题。

屏幕上有两个textviews。一个textview是分钟中剩余的秒数(因此它总是小于60,当它达到0时它将从59开始),而另一个textview保持总量计时器中剩余的秒数(从一个可能大于60的数字开始,在停止前倒计时到0)。

我有一个按钮可以将引用交换到这些TextViews,这样保留分钟中剩余秒数的文本将与保留总剩余秒数的文本交换,并且反之亦然。可以多次单击该按钮,以便可以根据用户的选择来回交换值。

奇怪的是,当我设置文本时,当我从一个方向交换到另一个方向时(从几分钟的秒数到剩余的总秒数),它会立即更新textviews,但是另一个方向将被延迟并等待scheduleAtFixedRate计时器完成另一次迭代(永远1000ms)。

显然,我想要的行为是立即交换文本,没有延迟。它只在一个方向上起作用,而在另一个方向上起作用。

以下是我正在使用的代码:

String totalSecs = secondsTotal.getText().toString();
String secsSecs = seconds.getText().toString();

//switch the TextView id's
//WORKS IMMEDIATELY
if (seconds.getId() == R.id.secondsTotal){
    seconds = (TextView)findViewById(R.id.secondsLabel);
    secondsTotal = (TextView)findViewById(R.id.secondsTotal);
    seconds.setText(totalSecs);
    secondsTotal.setText(secsSecs);
}
else{ //IS DELAYED UNTIL TIMER ITERATION
    seconds = (TextView)findViewById(R.id.secondsTotal);
    secondsTotal = (TextView)findViewById(R.id.secondsLabel);
    seconds.setText(secsSecs);
    secondsTotal.setText(totalSecs);
}

我的计时器如下:

Timer t = new Timer();

//set the schedule function
t.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                startCountdown(); //for seconds left in minute
                startCountdownTotal(); //for total seconds remaining
            }
        });
    }
}, 0, 1000);

1 个答案:

答案 0 :(得分:0)

添加

 seconds.invalidate();
 secondsTotal.invalidate(); 
更改值后调用后的

可能发生的事情是(以分钟为单位)的文本值比视图中的现有文本短,因此它会强制进行布局。