在安卓開發(fā)過程中經(jīng)常需要執(zhí)行一些短周期性的任務(wù)敷存,可以選擇Handler或者Time來實現(xiàn)部蛇∏系郏看一下二者的區(qū)別,Handler在多個方面表現(xiàn)比Time優(yōu)秀更推薦使用趋观。
1.易用性
Handler可以重復(fù)執(zhí)行某個任務(wù)稻艰。
Timer若在某個任務(wù)執(zhí)行/取消之后懂牧。若想再次執(zhí)行會拋出一個IllegalStateException。為了避免這個異常尊勿,需要重新創(chuàng)建一個Timer對象
2.周期可調(diào)整
若要執(zhí)行一個越來越快的周期任務(wù)僧凤,Handler可以做到,而Timer則消耗比較大
Handler.
private var handler : Handler = Handler()
private val mDelayTime = 1000
private var runnable = Runnable(){
public void run(){
//更新操作
update()
if(mDelayTime > 0){
handler.postDelayed(this,mDelaytime)
mDelaytime -= 100
}
}
}
handler.postDelayed(this,mDelayed)
如上例子就可以實現(xiàn)對周期的動態(tài)調(diào)整
Timer的schedeleAtFixedTime(TimerTask timeTask,long delay,long period)只能執(zhí)行周期性的任務(wù)所以不能調(diào)整周期元扔,若想要動態(tài)調(diào)整需要在執(zhí)行完一個定時器任務(wù)后躯保,
再啟動一個新的任務(wù)時設(shè)置新的時間
3.UI界面更新
handler:再創(chuàng)建時候可以指定創(chuàng)建線程,一般在Activity中創(chuàng)建即主線程中澎语。所以可以很方便的在回調(diào)方法中更新界面吻氧。
Timer:
異步回調(diào)多以必須借助handler去更新界面,不方便咏连。
既然都用handler去更新界面了盯孙,為何不把定時器功能也交給handler呢
4.內(nèi)存占比
Timer比handler更占內(nèi)存
Handler完成同樣的定時任務(wù)所占的內(nèi)存只占用了Timer的1/60
所以handler的方式更加節(jié)省內(nèi)存
無論從易用性還是內(nèi)存占比Handler都完勝Timer