倒计时、定时器的使用次数也不少,这篇文章做一个总结,不用每次需要的时候到处去百度了,本文章内的代码都经过本人亲测有效!
注意每次使用定时器的时候在不需要的时候都要及时取消掉,不要让不需要的定时器拖垮应用
方式一:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//十秒之后在这进行操作
}
},10000);
方式二:
//View线程实现延迟处理,内部基本与方式一一样,只不过Handler由视图提供
// mView 是我们的控件
mView.postDelayed(new Runnable() {
@Override
public void run() {
//三秒之后走这里
}
},3000);
方式三:
//别忘了 onDestroy() 内进行销毁,防止内存溢出
//第一个参数是总共多长时间,第二个参数是频率时间
CountDownTimer countDownTimer = new CountDownTimer(10000, 1000){
@Override
public void onTick(long millisUntilFinished) {
// 每刷新一次都走一次这里
// millisUntilFinished/1000 这是秒
}
@Override
public void onFinish() {
//字面意思,倒计时结束时走这里
}
};
countDownTimer.start();//开启刷新
countDownTimer.cancel();//取消刷新
方式四:
//定时器
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
//每次刷新再次操作
}
});
}
};
timer.schedule(timerTask,0,1000);//开启刷新,第二个参数是多长时间之后开始倒计时,第三个参数是多长时间进行一次
timer.cancel();//取消定时器
方式五:
int time = 10;
Handler mHandler = new Handler();
Runnable myRunnale = new Runnable() {
@Override
public void run() {
time--;
if(time>0){
//每次刷新走这里
}else{
//倒计时结束走这里
}
}
};
mHandler.post(myRunnale);//开始倒计时
mHandler.postDelayed(myRunnale,1000); //延迟倒计时
mHandler.removeCallbacks(myRunnale); //移除倒计时
方式六:
使用 rxjava
首先导入依赖
implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
使用
//定时器
private var mVideoDuration: Disposable? = null
clearData()
//第一个参数是多长时间开始,第二个参数是间隔时间,第三个参数是单位,可以是秒,分钟,小时,天
mVideoDuration = ObservableTake.interval(0, 1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
//每次倒计时走这里
}, {})
/**
* 清除定时器*/
fun clearData() {
if (mVideoDuration != null) {
mVideoDuration!!.dispose()
}
}
方式七(不推荐):
int stopTime = 10;
new Thread(new Runnable() {
@Override
public void run() {
while(true){
if (stopTime > 0){
//主线程操作数据
runOnUiThread(new Runnable() {
@Override
public void run() {
//每次刷新走这里
}
});
stopTime--;
}else {
//倒计时操作
}
try{
Thread.sleep(1000);
}catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
最后赠送一个双击退出的代码:
private Long finishTime = 0L
if (System.currentTimeMillis() - finishTime > 1500) {
Toast.makeText(getBaseContext(),"再按一次退出程序",Toast.LENGTH_SHORT).show();
finishTime = System.currentTimeMillis();
} else {
Toast.makeText(getBaseContext(),"我退出了",Toast.LENGTH_SHORT).show();
}