我在我的代码中实现了一个CountDownTimer,如下所示:在课程的顶部,我创建了
CountDownTimer myTimer;
然后当用户按下按钮Start时,将调用以下方法:
private void countme()
{
final int tick = 500;
final int countTime = 10000;
myTimer = new CountDownTimer(countTime, tick) {
@Override
public void onTick(final long millisUntilFinished) { }
@Override
public void onFinish() {
myPicture.setVisibility(View.GONE);
}
};
myTimer.start();
}
我有按钮全部停止myTimer.cancel()
。如您所见,如果未取消计时器,myPicture将消失。
即使我单击停止按钮以便调用myTimer.cancel()(我使用日志语句对其进行了检查),计数器仍会继续倒计时并在完成后使图片消失。 / p>
为什么它不停止?如何让它实际取消?
为了澄清,我确实知道如何实现Runnable计时器,但它们不像CountDownTimers那样准确,这就是我在这种情况下不使用它们的原因。
答案 0 :(得分:1)
经过大量尝试,窍门是在onCreate中声明计时器,但在其他方法中启动和取消计时器。取消计时器后,不会调用onFinish()。
myTimer = new CountDownTimer(COUNT_DOWN_TIME, TICK) {
@Override
public void onTick(final long millisUntilFinished) {
((TextView) findViewById(R.id.textView3)).setText(""
+ millisUntilFinished);
}
@Override
public void onFinish() {
findViewById(R.id.timer_imageBiew).setVisibility(View.GONE);
}
};
private fun startTimer() {
myTimer .start()
}
private fun stopTimer() {
myTimer .cancel()
}
答案 1 :(得分:0)
您的方法countme()
中正在初始化myTimer
,因此在此方法myTimer
之外没有任何价值。
使用此
在顶部声明
CountDownTimer myTimer;
final int tick = 500;
final int countTime = 10000;
onCreate
或Activity
Fragment
方法
myTimer = new CountDownTimer(countTime, tick) {
@Override
public void onTick(final long millisUntilFinished) { }
@Override
public void onFinish() {
myPicture.setVisibility(View.GONE);
}
};
现在使用myTimer.start()
开始,myTimer.cancel()
停止播放。
答案 2 :(得分:0)
你的帖子很奇怪。我刚尝试做一个示例活动:
public class MainActivity extends AppCompatActivity {
CountDownTimer myTimer;
Button btnStart;
Button btnCancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample2);
btnStart = (Button) findViewById(R.id.start);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
countme();
Toast.makeText(MainActivity.this, "Count Started!", Toast.LENGTH_SHORT).show();
}
});
btnCancel = (Button) findViewById(R.id.cancel_timer);
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myTimer.cancel();
Toast.makeText(MainActivity.this, "Clicked Stop Timer!", Toast.LENGTH_SHORT).show();
}
});
}
private void countme() {
final int tick = 500;
final int countTime = 10000;
myTimer = new CountDownTimer(countTime, tick) {
@Override
public void onTick(final long millisUntilFinished) {
Log.d(MainActivity.class.getSimpleName(), "onTick()");
}
@Override
public void onFinish() {
// myPicture.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, "In onFinish()", Toast.LENGTH_SHORT).show();
}
};
myTimer.start();
}
}
它完美无缺。它会停止计时器。但是我去看了看,发现这个answer,它提到CountDownTimer
似乎没有用,所以他建议改用Timer
。看看吧。干杯!
答案 3 :(得分:0)
这是一个有效的例子,我已经实现了处理程序和计时器,你可以选择一个。
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity {
private CountDownTimer myTimer;
final int TICK = 500;
final int COUNT_DOWN_TIME = 2000;
// Option 2 using handler
private Handler myhandler = new Handler();
private Runnable runnable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Option 1 using timer
myTimer = new CountDownTimer(COUNT_DOWN_TIME, TICK) {
@Override
public void onTick(final long millisUntilFinished) {
((TextView) findViewById(R.id.textView3)).setText(""
+ millisUntilFinished);
}
@Override
public void onFinish() {
findViewById(R.id.timer_imageBiew).setVisibility(View.GONE);
}
};
// Option 2 using handler
runnable = new Runnable() {
@Override
public void run() {
findViewById(R.id.handlerImageView).setVisibility(View.GONE);
}
};
findViewById(R.id.start_timer).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
// Option 1 using timer
myTimer.start();
// Option 2 using handler
myhandler.postDelayed(runnable, COUNT_DOWN_TIME);
}
});
findViewById(R.id.stop_timer).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Option 1 stop timer
myTimer.cancel();
// Option 2 stop handler
myhandler.removeCallbacks(runnable);
}
});
}
}