安卓定時器的五種實(shí)現(xiàn)方式

? ? ? 一直以來就想寫技術(shù)博文了毁习,之前有在csdn寫過嗅虏,最近一段時間csdn不知道什么問題,無法寫博客汹胃。平時也喜歡看簡書的博文婶芭。于是就想在簡書上寫些東西。這是我在簡書的第一篇博客着饥,有什么紕漏犀农,望各位看官批評指正。
? ? ? 最近在寫定時的一些功能宰掉,比如驗證碼呵哨,定時器什么的赁濒。想想就想把這一塊功能實(shí)現(xiàn)給總結(jié)一下。分享給給位道友孟害。本著開源精神拒炎,后期我會抽出工具類。不多說挨务,下面是我的三種實(shí)現(xiàn)方式:

1.通過Timer與TimerTask實(shí)現(xiàn)

2.通過CountdownTimer進(jìn)行實(shí)現(xiàn)

3.通過Handler與Message實(shí)現(xiàn)

4.通過Handler加Thread實(shí)現(xiàn)

5.通過Handler與Runnable實(shí)現(xiàn)

對于倒計時個人喜歡用第二種击你,CountdownTimer是安卓封裝好的一個類,簡單易用且線程安全谎柄。對于計時可用4,5較為方便丁侄。不多說了直接上代碼

packagecom.jugui.timedemo;


importandroid.os.Bundle;

importandroid.os.CountDownTimer;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.support.v7.app.AppCompatActivity;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.TextView;

importjava.util.Timer;

importjava.util.TimerTask;

public classMainActivityextendsAppCompatActivityimplementsView.OnClickListener {

privateTextViewtv_time;

privateButtonbtn_three;

privateButtonbtn_two;

privateButtonbtn_one;

privateButtonbtn_four;

privateButtonbtn_five;

private inttime;

privateTimertimer;

privateHandlermHandler=newHandler() {

@Override

public voidhandleMessage(Message msg) {

super.handleMessage(msg);

switch(msg.what) {

case1:

timer.cancel();

tv_time.setText("獲取驗證碼");

tv_time.setEnabled(true);

break;

case2:

case5:

tv_time.setText("剩余"+time+"秒");

tv_time.setEnabled(false);

break;

case3:

--time;

Message message =mHandler.obtainMessage(3);

if(time<=0) {

timer.cancel();

tv_time.setText("獲取驗證碼");

tv_time.setEnabled(true);

}else{

tv_time.setText("剩余"+time+"秒");

tv_time.setEnabled(false);

mHandler.sendMessageDelayed(message,1000);

}

case4:

tv_time.setText("獲取驗證碼");

tv_time.setEnabled(true);

break;

}

}

};

privateMyCountDownTimerdownTimer;

privateThreadthread;

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

private voidinitView() {

btn_one= (Button) findViewById(R.id.btn_one);

btn_two= (Button) findViewById(R.id.btn_two);

btn_three= (Button) findViewById(R.id.btn_three);

btn_four= (Button) findViewById(R.id.btn_four);

btn_five= (Button) findViewById(R.id.btn_five);

tv_time= (TextView) findViewById(R.id.tv_time);

btn_one.setOnClickListener(this);

btn_two.setOnClickListener(this);

btn_three.setOnClickListener(this);

btn_four.setOnClickListener(this);

btn_five.setOnClickListener(this);

}

@Override

public voidonClick(View view) {

switch(view.getId()) {

caseR.id.btn_one:

timeByTimer();

break;

caseR.id.btn_two:

timeByCount();

break;

caseR.id.btn_three:

timeByHandler();

break;

caseR.id.btn_four:

timeByThread();

break;

caseR.id.btn_five:

timeByRunnable();

break;

}

}

/**********************? ? ? ? ? ? ? ? Runnable? ? ? ? ? ? *********************************/

private voidtimeByRunnable() {

tv_time.setText("第五種獲取驗證碼");

time=60;

tv_time.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View view) {

mHandler.postDelayed(runnable,1000);

}

});

}

Runnablerunnable=newRunnable() {

@Override

public voidrun() {

--time;

if(time<=0) {

tv_time.setText("獲取驗證碼");

tv_time.setEnabled(true);

}else{

tv_time.setText("剩余"+time+"秒");

tv_time.setEnabled(false);

mHandler.postDelayed(this,1000);

}

}

};

/**********************? ? ? ? ? ? ? ? Runnable? ? ? ? ? ? *********************************/

/**********************? ? ? ? ? ? ? ? Thread? ? ? ? ? ? *********************************/

private voidtimeByThread() {

tv_time.setText("第四種獲取驗證碼");

time=60;

tv_time.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View view) {

thread=newThread(newMyThread());

thread.start();

}

});

}

classMyThreadimplementsRunnable {

@Override

public voidrun() {

while(true) {

try{

Thread.sleep(1000);

--time;

Message message =mHandler.obtainMessage();

if(time<=0) {

message.what=4;

}else{

message.what=5;

}

mHandler.sendMessage(message);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

}

/**********************? ? ? ? ? ? ? Thread? ? ? ? ? ? *********************************/

private voidtimeByHandler() {

tv_time.setText("第三種獲取驗證碼");

time=60;

tv_time.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View view) {

Message message =mHandler.obtainMessage(3);

mHandler.sendMessageDelayed(message,1000);

}

});

}

/**********************? ? ? ? ? ? ? ? CountDownTimer? ? ? ? ? ? *********************************/

private voidtimeByCount() {

//計時60秒,每隔1秒計數(shù)一次

tv_time.setText("第二種獲取驗證碼");

downTimer=newMyCountDownTimer(60000,1000);

tv_time.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View view) {

downTimer.start();

}

});

}

classMyCountDownTimerextendsCountDownTimer {

publicMyCountDownTimer(longmillisInFuture,longcountDownInterval) {

super(millisInFuture, countDownInterval);

}

@Override

public voidonTick(longl) {

/*每隔countDownInterval毫秒會回調(diào)一次*/

tv_time.setText("剩余"+ (l /1000) +"秒");

tv_time.setEnabled(false);

}

@Override

public voidonFinish() {

/*計時完成后回調(diào)*/

tv_time.setText("獲取驗證碼");

tv_time.setEnabled(true);

}

}

/**********************? ? ? ? ? ? ? ? CountDownTimer? ? ? ? ? ? *********************************/

/**********************? ? ? ? ? ? ? ? TimerTask? ? ? ? ? ? *********************************/

private voidtimeByTimer() {

timer=newTimer();

time=60;

tv_time.setText("第一種獲取驗證碼");

tv_time.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View view) {

timer.schedule(newMyTimerTask(),1000,1000);//第二個參數(shù)代表1秒后執(zhí)行朝巫,設(shè)置為0就是馬上執(zhí)行鸿摇,第三個參數(shù)代表每間隔1秒執(zhí)行一次

}

});

}

classMyTimerTaskextendsTimerTask {

@Override

public voidrun() {

--time;

Message message =mHandler.obtainMessage();/*為什么不用new Message可以參考http://blog.csdn.net/h3c4lenovo/article/details/7914902*/

if(time<=0) {

message.what=1;

}else{

message.what=2;

}

mHandler.sendMessage(message);

}

}

/**********************? ? ? ? ? ? ? ? TimerTask? ? ? ? ? ? *********************************/

@Override

protected voidonDestroy() {

super.onDestroy();

if(timer!=null) {

timer.cancel();

timer=null;

}

if(downTimer!=null) {

downTimer.cancel();

downTimer=null;

}

if(thread!=null) {

thread=null;

}

}

}

第一種方式是采用java的Timer實(shí)現(xiàn)

第二種方式CountDownTimer非常適合倒計時的實(shí)現(xiàn),是Android里面封裝的倒計時類劈猿,使用簡單拙吉,可在回調(diào)中直接做ui改變。

第三種方式就比較偏向安卓的寫法了handler + message揪荣。后面兩種采用子線程與ui線程分離筷黔。我推薦使用第二種或者第四種。谷歌官方使用的是CountdownTimer变逃,很適合于倒計時的需求必逆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怠堪,一起剝皮案震驚了整個濱河市揽乱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粟矿,老刑警劉巖凰棉,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陌粹,居然都是意外死亡撒犀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門掏秩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來或舞,“玉大人,你說我怎么就攤上這事蒙幻∮车剩” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵邮破,是天一觀的道長诈豌。 經(jīng)常有香客問我仆救,道長,這世上最難降的妖魔是什么矫渔? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任彤蔽,我火速辦了婚禮,結(jié)果婚禮上庙洼,老公的妹妹穿的比我還像新娘顿痪。我一直安慰自己,他們只是感情好送膳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布员魏。 她就那樣靜靜地躺著,像睡著了一般叠聋。 火紅的嫁衣襯著肌膚如雪撕阎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天碌补,我揣著相機(jī)與錄音虏束,去河邊找鬼。 笑死厦章,一個胖子當(dāng)著我的面吹牛镇匀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袜啃,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼汗侵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了群发?” 一聲冷哼從身側(cè)響起晰韵,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熟妓,沒想到半個月后雪猪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡起愈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年只恨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抬虽。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡官觅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阐污,到底是詐尸還是另有隱情休涤,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布疤剑,位于F島的核電站滑绒,受9級特大地震影響闷堡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疑故,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一杠览、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纵势,春花似錦踱阿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牛曹,卻和暖如春佛点,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黎比。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工超营, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阅虫。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓演闭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親颓帝。 傳聞我的和親對象是個殘疾皇子米碰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容