導航:首頁 > 操作系統 > androidhandler定時

androidhandler定時

發布時間:2023-01-16 16:45:52

⑴ 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);
}
};

閱讀全文

與androidhandler定時相關的資料

熱點內容
msf埠遷移命令 瀏覽:880
工商app積分怎麼查詢 瀏覽:143
鐵路app怎麼買火車票 瀏覽:309
移魅族除的app怎麼添加 瀏覽:240
兔籠子大號加密 瀏覽:171
單片機程序燒錄操作成功 瀏覽:878
指標高拋低吸點位源碼 瀏覽:205
25匹壓縮機銅管 瀏覽:570
單片機單燈左移05 瀏覽:150
買伺服器練手什麼配置 瀏覽:783
伺服器被毀該怎麼辦 瀏覽:939
python私有庫 瀏覽:514
Python有中文嗎 瀏覽:736
麥塊的伺服器為什麼都進不去 瀏覽:474
新買的伺服器如何打開 瀏覽:35
安卓軟體游戲怎麼開發 瀏覽:319
用撲克擺愛心解壓神器怎麼擺 瀏覽:70
松下製冷壓縮機 瀏覽:275
pdf里怎麼修改文字 瀏覽:686
已保存文檔加密如何設置 瀏覽:413