无法让倒数计时器在我的程序中工作或显示
Can't get coundown timer to work or display in my program
我是一名新程序员,这是我的第一个项目,但我在使用三个定时器进行适当循环时遇到了一些麻烦,这些定时器应该一个接一个 运行。我设法让对象在循环中保存它们应该保存的值,但出于某种原因,计时器没有像它应该的那样显示在文本字段中。
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("mTimer:", String.valueOf(mTimer));
Log.i("mReps:", String.valueOf(mReps));
Log.i("Flexion:", String.valueOf(flexionTimer));
Log.i("Hold:", String.valueOf(holdTimer));
Log.i("Extension:", String.valueOf(extensionTimer));
for (int iter = 0; iter < mReps; iter++) {
Log.i("Loop:", String.valueOf(iter));
final Timer workingFlexionTimer = new Timer();
workingFlexionTimer.schedule(new TimerTask() {
int counter = ((int) flexionTimer / 1000);
@Override
public void run () {
runOnUiThread(new Runnable() {
@Override
public void run() {
mPhase.setText("Flexion");
mCountDownTimer.setText("" + String.format(String.valueOf(counter + 1)));
}
});
if (counter-- == 0) {
workingFlexionTimer.cancel();
}
}
}, 0, 1000);
final Timer workingHoldTimer = new Timer();
workingHoldTimer.schedule(new TimerTask() {
int counter = ((int) holdTimer / 1000);
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mPhase.setText("Hold!!!");
mCountDownTimer.setText("" + String.format(String.valueOf(counter + 1)));
}
});
if (counter-- == 0) {
workingHoldTimer.cancel();
}
}
}, flexionTimer, 1000);
final Timer workingExtensionTimer = new Timer();
workingExtensionTimer.schedule(new TimerTask() {
int counter = ((int) extensionTimer / 1000);
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mPhase.setText("Extension");
mCountDownTimer.setText("" + String.format(String.valueOf(counter + 1)));
}
});
if (counter-- == 0) {
workingExtensionTimer.cancel();
}
}
}, (flexionTimer + holdTimer), 1000);
}
此时我有点不知所措,如有任何建议,我们将不胜感激。
使用处理程序
private void Timer() {
handler = new Handler();
Run =new Runnable() {
@Override
public void run() { //Do something after 10 sec
Toast.makeText(getActivity(), "Timer called!",Toast.LENGTH_LONG).show();
Timer(); // Do again
}};
handler.postDelayed(Run , 10000); // 10 sec
}
第一个定时器flexionCountDownTimer是在循环中启动的,也就是说如果mReps大于,就会启动多次1. 这可能导致 flexionCountDownTimer 的第二个 运行 在第一个 运行 完成之前。这是您的预期行为吗?
更新
对于计时器我总是这样做:
final TextView textView = (TextView)findViewById(R.id.textView);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
int counter = 10;
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(""+counter);
}
});
if (counter-- == 0){
timer.cancel();
}
}
}, 0, 1000);
timer.schedule(new TimerTask() {
int counter = 10;
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(""+counter);
}
});
if (counter-- == 0){
timer.cancel();
}
}
}, 10000, 1000);
timer.schedule(new TimerTask() {
int counter = 10;
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(""+counter);
}
});
if (counter-- == 0){
timer.cancel();
}
}
}, 20000, 1000);
了解更多信息check this
在 link...
public void schedule(TimerTask task, long delay, long period)
以上代码。立即启动 运行()。
long delay = 0;// in ms
long period = 1000;// in ms
所以每 1000 毫秒调用 运行() 和计数器--。当 counter = 0 时取消。
如果要运行,一个接一个,放延时。
更新
现在第一个会立即 运行,第二个会等待 10000 毫秒(10 秒)然后 运行,最后第三个会等待 20000 毫秒(20 秒)然后 运行。
我是一名新程序员,这是我的第一个项目,但我在使用三个定时器进行适当循环时遇到了一些麻烦,这些定时器应该一个接一个 运行。我设法让对象在循环中保存它们应该保存的值,但出于某种原因,计时器没有像它应该的那样显示在文本字段中。
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("mTimer:", String.valueOf(mTimer));
Log.i("mReps:", String.valueOf(mReps));
Log.i("Flexion:", String.valueOf(flexionTimer));
Log.i("Hold:", String.valueOf(holdTimer));
Log.i("Extension:", String.valueOf(extensionTimer));
for (int iter = 0; iter < mReps; iter++) {
Log.i("Loop:", String.valueOf(iter));
final Timer workingFlexionTimer = new Timer();
workingFlexionTimer.schedule(new TimerTask() {
int counter = ((int) flexionTimer / 1000);
@Override
public void run () {
runOnUiThread(new Runnable() {
@Override
public void run() {
mPhase.setText("Flexion");
mCountDownTimer.setText("" + String.format(String.valueOf(counter + 1)));
}
});
if (counter-- == 0) {
workingFlexionTimer.cancel();
}
}
}, 0, 1000);
final Timer workingHoldTimer = new Timer();
workingHoldTimer.schedule(new TimerTask() {
int counter = ((int) holdTimer / 1000);
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mPhase.setText("Hold!!!");
mCountDownTimer.setText("" + String.format(String.valueOf(counter + 1)));
}
});
if (counter-- == 0) {
workingHoldTimer.cancel();
}
}
}, flexionTimer, 1000);
final Timer workingExtensionTimer = new Timer();
workingExtensionTimer.schedule(new TimerTask() {
int counter = ((int) extensionTimer / 1000);
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mPhase.setText("Extension");
mCountDownTimer.setText("" + String.format(String.valueOf(counter + 1)));
}
});
if (counter-- == 0) {
workingExtensionTimer.cancel();
}
}
}, (flexionTimer + holdTimer), 1000);
}
此时我有点不知所措,如有任何建议,我们将不胜感激。
使用处理程序
private void Timer() { handler = new Handler(); Run =new Runnable() { @Override public void run() { //Do something after 10 sec Toast.makeText(getActivity(), "Timer called!",Toast.LENGTH_LONG).show(); Timer(); // Do again }}; handler.postDelayed(Run , 10000); // 10 sec }
第一个定时器flexionCountDownTimer是在循环中启动的,也就是说如果mReps大于,就会启动多次1. 这可能导致 flexionCountDownTimer 的第二个 运行 在第一个 运行 完成之前。这是您的预期行为吗?
更新
对于计时器我总是这样做:
final TextView textView = (TextView)findViewById(R.id.textView);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
int counter = 10;
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(""+counter);
}
});
if (counter-- == 0){
timer.cancel();
}
}
}, 0, 1000);
timer.schedule(new TimerTask() {
int counter = 10;
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(""+counter);
}
});
if (counter-- == 0){
timer.cancel();
}
}
}, 10000, 1000);
timer.schedule(new TimerTask() {
int counter = 10;
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(""+counter);
}
});
if (counter-- == 0){
timer.cancel();
}
}
}, 20000, 1000);
了解更多信息check this
在 link...
public void schedule(TimerTask task, long delay, long period)
以上代码。立即启动 运行()。
long delay = 0;// in ms
long period = 1000;// in ms
所以每 1000 毫秒调用 运行() 和计数器--。当 counter = 0 时取消。
如果要运行,一个接一个,放延时。
更新
现在第一个会立即 运行,第二个会等待 10000 毫秒(10 秒)然后 运行,最后第三个会等待 20000 毫秒(20 秒)然后 运行。