timeTask
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了石棉免費(fèi)建站歡迎大家使用!
timer = new Timer();
? TimerTask timerTask = new TimerTask(){
? ? ? @Override
? ? ? public void run() {
? ? ? ? ? 方法();
? ? ? }
? };
? //每隔3秒掃描一次
? timer.schedule(timerTask,1000, 3 * 1000);
new Handler().postDelayed((new Runnable() {
@Override
public void run() { ? ? ? 方法()}}), 1000);
在Java中有時(shí)候需要使程序暫停一點(diǎn)時(shí)間,稱為延時(shí)。普通延時(shí)用Thread.sleep(int)方法,這很簡單。它將當(dāng)前線程掛起指定的毫秒數(shù)。如
Java 代碼復(fù)制內(nèi)容到剪貼板
try
{
Thread.currentThread().sleep(1000);//毫秒
}
catch(Exception e){}
在這里需要解釋一下線程沉睡的時(shí)間。sleep()方法并不能夠讓程序"嚴(yán)格"的沉睡指定的時(shí)間。例如當(dāng)使用5000作為sleep()方法的參數(shù)時(shí),線 程可能在實(shí)際被掛起5000.001毫秒后才會(huì)繼續(xù)運(yùn)行。當(dāng)然,對于一般的應(yīng)用程序來說,sleep()方法對時(shí)間控制的精度足夠了。
但是如果要使用精確延時(shí),最好使用Timer類:
Java 代碼復(fù)制內(nèi)容到剪貼板
Timer timer=new Timer();//實(shí)例化Timer類
timer.schedule(new TimerTask(){
public void run(){
System.out.println("退出");
this.cancel();}},500);//五百毫秒
這種延時(shí)比sleep精確。上述延時(shí)方法只運(yùn)行一次,如果需要運(yùn)行多次, 使用timer.schedule(new MyTask(), 1000, 2000); 則每間隔2秒執(zhí)行MyTask()
??開發(fā)中經(jīng)常遇到用計(jì)時(shí)器的時(shí)候,例如:每秒輸出一次log,這時(shí)候就要用到延時(shí)操作,這里總結(jié)了幾種常用的方法。
?? AlarmManager 是Android的全局定時(shí)器,可以在指定時(shí)間執(zhí)行定時(shí)任務(wù)。定時(shí)任務(wù)通過PendingIntent 的 getActivity()、getService()或 getBroadcast() 來執(zhí)行。簡單的說就是我們設(shè)定一個(gè)時(shí)間,然后在該時(shí)間到來時(shí),AlarmManager為我們廣播一個(gè)我們設(shè)定的Intent出來,在接收到設(shè)定的Intent時(shí)執(zhí)行定時(shí)任務(wù)。
(2) setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
該方法用于設(shè)置重復(fù)鬧鐘,其中參數(shù)說明如下:
type:鬧鐘類型
startTime:首次執(zhí)行鬧鐘的時(shí)間
intervalTime:兩次執(zhí)行鬧鐘的時(shí)間間隔
pi:鬧鐘響應(yīng)動(dòng)作
(3) setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
該方法也用于設(shè)置重復(fù)鬧鐘,與第二個(gè)方法相似,區(qū)別在于其兩次鬧鐘執(zhí)行的間隔時(shí)間不是固定的。
?? AlarmManager實(shí)現(xiàn)定時(shí)的方法,我還沒有用到過,以上內(nèi)容是在網(wǎng)上查找資料后自己在一個(gè)小demo中小小試驗(yàn)了的,有錯(cuò)誤或描述不清的地方請見諒。下面是我參考的介紹AlarmManager的三篇文章。
延時(shí)操作,可以用下列方案:
方案1:線程阻斷
try {
Thread.currentThread().sleep(2000);//阻斷2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
方案2:使用Handler的postDelayed延遲操作。
mHandler .postDelayed(mRunnable, 3000); // 在Handler中執(zhí)行子線程并延遲3s。
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
mHandler.sendEmptyMessage(1);
}
};
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//3s后執(zhí)行代碼
}
}。
方法如下
其中的時(shí)間單位為毫秒
本例中就是1秒之后執(zhí)行
更多內(nèi)容點(diǎn)此查看。
在Android中大概又兩種實(shí)現(xiàn)方式:一種是java中的Timer類,一種是Android中的Alerm機(jī)制。兩者功能差不多。
Alerm具有cup運(yùn)行鎖,而Timer不具有cpu鎖。
每種手機(jī)都具有自己的休眠策略,當(dāng)長時(shí)間不是手機(jī)的情況下,cpu就會(huì)進(jìn)入休眠狀態(tài)。在這種情況下Timer將無法工作。而Alerm具有cpu鎖,將會(huì)導(dǎo)致cpu無法休眠。
AlarmManager ?manger=(AlarManger)getSystemService(Context.ALARM_SERVICE);
manger.set(int flag,long time,PendingIntent ?pendingIntent);
set方法參數(shù)說明:
第一個(gè)參數(shù)flag為工作類型:
AlarmManger .ELAPSED_REALTIME:讓定時(shí)時(shí)間從開機(jī)算起時(shí)間算起,但不會(huì)喚醒cpu。
AlarmManger.ELAPSED_REALTIME_WAKEUP:同樣表示讓定時(shí)時(shí)間從開機(jī)算起,但會(huì)喚醒 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CPU。
RTC:表示讓定時(shí)任務(wù)從1970年1月1日算起,但是不喚醒cpu。
RTC_WAKEUP:表示讓定時(shí)任務(wù)從1970年1月1日算起,但是喚醒cpu。
提示:SystemClock.elapsedReadtime()---獲取系統(tǒng)開機(jī)至今所經(jīng)歷的毫秒數(shù);
? ? ? ?System.currentTimeMillis()-------方法獲取1970年1月1日至今天的毫秒數(shù);
第二個(gè)參數(shù): 延時(shí)的時(shí)間,單位毫秒;
第三個(gè)參數(shù): PendingIntent指定具體動(dòng)作;
注意:Android4.4版本后set方法觸發(fā)不準(zhǔn)確,有可能會(huì)延時(shí)一段時(shí)間執(zhí)行(這不是Bug,是電池性能優(yōu)化,系統(tǒng)會(huì)檢測目前有多少個(gè)Alarm任務(wù)存在,然后將觸發(fā)相近的幾個(gè)任務(wù)一起執(zhí)行)
如果要精確執(zhí)行,將 setExact() 方法代替set()方法。
cancel ( PendingIntent ? operation )
方法將會(huì)取消Intent匹配的任何鬧鐘。
setRepeating(int type,long triggerAtTime,long interval,PendingIntent operation);
參數(shù)說明:interval重復(fù)時(shí)間間隔;(4.4后觸發(fā)不準(zhǔn)時(shí))
AlarmManger的其它功能:
設(shè)置系統(tǒng)時(shí)間和時(shí)區(qū)
添加權(quán)限:android.permission.SET_TIME;
通過setTime(long millis)方法設(shè)置系統(tǒng)時(shí)間;
需要添加android.permission.SET_TIME_ZONE權(quán)限。
通過setTimeZone(String tz)方法設(shè)置時(shí)區(qū);
標(biāo)題名稱:android延時(shí),android延時(shí)任務(wù)
本文URL:http://aaarwkj.com/article30/dssjhso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、Google、網(wǎng)站營銷、App開發(fā)、手機(jī)網(wǎng)站建設(shè)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)