⑴ Handler源碼分析
Handler對於android開發者再熟悉不過了,也是面試題的常客了,所以了解Handler機制的源碼就很有必要了,雖然Handler分析的文章已經有很多,但是自己總結一遍,印象才更深刻。
Handler機制,是Android中的一種消息傳遞機制,在開發中十分常用。由於Android從3.0開始不允許耗時操作在主線程中執行,必須在子線程中執行完後,將結果發送到主線程中更新UI。所以簡單來講Handler就是子線程和主線程通信的一種技術。
先是常規使用,Handler在主線程中創建,開啟子線程處理耗時操作,再通過Handler發送消息到主線程,Handler的handleMessage()方法就會被回調,再更新UI。
以及也很常用的,post()和postDelayed()。
還有一種場景,就是子線程中創建Handler,讓子線程成為輪訓的線程,接收其他線程的消息,開發中並不多,但是特定場景會很有用,例如有一個一直執行的子線程,一直定時掃描著當前位置信息,到了指定范圍,發送一個播放語音的消息的消息到主線程。
接下來就是Handler源碼分析了:
一般我們獲取Message會調用Handler的obtainMessage()方法,這個方法是獲取一個復用的Message對象,內部採用享元模式復用Message對象,在Android中,View繪制,Activity生命周期,都是使用Handler發送Message實現,如果每次都new一個消息對象,肯定是十分消耗內存的,也容易產生GC垃圾回收導致卡頓。
我們平常在主線程使用Handler時,並沒有調用過Looper.prepare()和Looper.loop()這2個方法,為什麼創建Handler時不會拋出異常呢?
原因就是創建Handler時,調用Looper.myLooper()獲取主線程綁定的Looper不為空,所以沒有拋出異常。經過Looper類中查找發現,除了Looper.prepare()之外,還有一個prepareMainLooper()的方法。
prepareMainLooper()方法的注釋,意思大概就是,創建主線程的Looper對象,該方法由Android框架在主線程自動調用,我們不應該主動調用該方法。
那麼什麼時候會調用prepareMainLooper()方法呢,AndroidStudio點擊方法查找調用鏈,我們發現在ActivityThread中有調用。ActivityThread是Android程序的主線程,main方法則是啟動的方法,我們看到先是調用了Looper.prepareMainLooper(),初始化主線程的Looper。再調用了Looper.loop()開啟主線程輪訓。
⑵ 如何定時刷新Android界面
Handler.sendEmptyMessageDelayed(0, 1000);來實現
sendEmptyMessageDelayed:延時多少毫秒,向Handler發送信息
具體代碼和效果
每隔1秒刷新一次時間
⑶ android studio怎麼編寫計時器
類似iOS中的NSTimer 定時器功能,開關控制隨機幾秒鍾執行指定功能;
平台:Android
開發環境:android Studio
代碼實現:
一. 創建Handler對象和Runnable對象
[java] view plain print?
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (mPageOpen){
if (interstitialAd.isLoaded()){ //示例-谷歌插頁廣告
interstitialAd.show();
}else {
AdRequest adRequest = new AdRequest.Builder().build();
interstitialAd.loadAd(adRequest);
}
int random = (int)(Math.random() * 10 +20)*1000; //隨機時間循環執行
handler.postDelayed(this, random);
}
}
};
二. 開關控制
[java] view plain print?
Switch mSwith = (Switch) findViewById(R.id.switchPage);
mSwith.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
mPageOpen = true;
} else {
mPageOpen = false;
}
handler.postDelayed(runnable, 15000); //開關控制執行
}
});
三. 移除定時器
[java] view plain print?
handler.removeCallbacks(runnable);
⑷ 安卓定時器Handler如何關閉
{
publicTimeCounts(longmillisInFuture,longcountDownInterval){
super(millisInFuture,countDownInterval);//參數依次為總時長,和計時的時間間隔
}
@Override
publicvoidonFinish(){//計時完畢時觸發
}
@Override
publicvoidonTick(longmillisUntilFinished){//計時過程顯示
//倒計時數可以寫在這兒
}
}
TimeCounts timeCounts = new TimeCounts(30000, 1000);//總時長30s,間隔1s
timeCounts.start();//倒計時開始
timeCounts.cancel();//取消倒計時
⑸ android設置定時器調用時設置時間
你的意思是,假設3個RadioButton,第一個設為10秒,第二個設為20秒,第三個設為30秒,然後一起倒計時到0嗎?如果是這樣的話,只需要在Handler的handleMessage中去減時間就行了。
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
xx.setText(Integer.parseInt(xx.getText()-1);
}
};