通過實際項目的練習(xí),掌握了幾種android基本定時器和延時的用法,這里我想總結(jié)一下作為自己的收獲,下面列出的是比較簡潔的模式,方便簡單地在程序中直接調(diào)用。
1.CountDownTimer
public class ZpTimerActivity extends Activity {
private CountDownTimer mTimer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
initView();
}
private void initView() {
if (mTimer == null) {
mTimer = new CountDownTimer((long) (5 * 1000), 1000) {
@Override
public void onTick(long millisUntilFinished) {
if (!ZpTimerActivity.this.isFinishing()) {
int remainTime = (int) (millisUntilFinished / 1000L);
Log.e("zpan","======remainTime=====" + remainTime);
}
}
@Override
public void onFinish() {
Log.e("zpan","======onFinish=====");
}
};
mTimer.start();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
}
}
Log:
12-06 16:31:17.809 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====4
12-06 16:31:18.811 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====3
12-06 16:31:19.812 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====2
12-06 16:31:20.813 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====1
12-06 16:31:22.769 20276-20276/com.example.zpdemo E/zpan: ======onFinish=====
三種常用的定時器
1.Handler類的postDelayed方法:
Handler mHandler = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
//do something
//每隔1s循環(huán)執(zhí)行run方法
mHandler.postDelayed(this, 1000);
}
};
主線程中調(diào)用: mHandler.postDelayed(r, 100);//延時100毫秒
2.用handler+timer+timeTask方法:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1){
//do something
}
super.handleMessage(msg);
}
};
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
主線程中調(diào)用:timer.schedule(timerTask,1000,500);//延時1s,每隔500毫秒執(zhí)行一次run方法
3.Thread+handler方法:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1){
//do something
}
super.handleMessage(msg);
}
};
class MyThread extends Thread {//這里也可用Runnable接口實現(xiàn)
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);//每隔1s執(zhí)行一次
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
主線程中調(diào)用:new Thread(new MyThread()).start();
二、三種延時的快捷方法:
1.Handler的postDelayed方法:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//do something
}
}, 1000); //延時1s執(zhí)行
2.timer + TimerTask方法:
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//do something
}
},1000);//延時1s執(zhí)行
3.Thread方法:
new Thread(new MyThread()).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);//延時1s
//do something
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();