學(xué)習(xí)Android Handler消息傳遞機(jī)制
Android只允許UI線程修改Activity里的UI組件。當(dāng)Android程序第一次啟動(dòng)時(shí),Android會(huì)同時(shí)啟動(dòng)一條主線程(Main Thread),主線程主要負(fù)責(zé)處理與UI相關(guān)的事件,如用戶的按鍵事件、屏幕繪圖事件,并把相關(guān)的事件分發(fā)到對應(yīng)的組件進(jìn)行處理。所以,主線程通常又被稱為UI線程。
Android只允許UI線程修改Activity里的UI組件,這樣會(huì)導(dǎo)致新啟動(dòng)的線程無法動(dòng)態(tài)改變界面組件的屬性值。但在實(shí)際的Android程序開發(fā)中,尤其是涉及動(dòng)畫的游戲開發(fā)中,需要讓新啟動(dòng)的線程周期性的改變界面組件的屬性值,這就需要借助于Handler的消息傳遞機(jī)制來實(shí)現(xiàn)了。
1 Handler類簡介
Handler類的主要作用有兩個(gè):
(1)在新啟動(dòng)的線程中發(fā)送消息
sendMessage(Message msg) 或者
sendEmptyMessage(int what)
兩者的差異,請看Android源碼:
public final boolean sendMessage(Message msg) { return sendMessageDelayed(msg, 0); } public final boolean sendEmptyMessage(int what) { return sendEmptyMessageDelayed(what, 0); }
再看sendEmptyMessageDelayed(what, 0)的源碼:
public final boolean sendEmptyMessageDelayed(int what, long delayMillis) { Message msg = Message.obtain(); msg.what = what; return sendMessageDelayed(msg, delayMillis); }
其實(shí),sendMessage(Message msg) 和sendEmptyMessage(int what) 實(shí)際上是一樣的,一個(gè)傳Message類型的msg,一個(gè)傳int類型的what,傳what的,最終會(huì)轉(zhuǎn)為msg。
(2)在主線程中獲取、處理消息
public void handleMessage(Message msg)
2 使用實(shí)例
下面使用Handler以及Timer類實(shí)現(xiàn)時(shí)間的自動(dòng)刷新
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView txt=(TextView)findViewById(R.id.showTime); final Handler myHandler=new Handler() { @Override public void handleMessage(Message msg) { if(msg.what==0x12) { txt.setText("當(dāng)前時(shí)間:"+new java.util.Date()); } } }; Button btn=(Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub new Timer().schedule(new TimerTask() { @Override public void run() { // TODO Auto-generated method stub myHandler.sendEmptyMessage(0x12); } }, 0,1000); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android性能優(yōu)化之捕獲java crash示例解析
這篇文章主要介紹了Android性能優(yōu)化之捕獲java crash示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android實(shí)時(shí)獲取攝像頭畫面?zhèn)鬏斨罰C端思路詳解
這篇文章主要介紹了Android實(shí)時(shí)獲取攝像頭畫面?zhèn)鬏斨罰C端思路詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Android事件分發(fā)機(jī)制深入刨析原理及源碼
Android?的事件分發(fā)機(jī)制大體可以分為三部分:事件生產(chǎn)、事件分發(fā)?、事件消費(fèi)。事件的生產(chǎn)是由用戶點(diǎn)擊屏幕產(chǎn)生,我們這次著重分析事件的分發(fā)和消費(fèi),因?yàn)槭录职l(fā)和處理聯(lián)系的過于緊密,這篇文章將把事件的分發(fā)和消費(fèi)放在一起分析2023-04-04實(shí)例講解Android中SQLiteDatabase使用方法
這篇文章主要以一個(gè)簡單的實(shí)例為大家詳細(xì)講解Android中SQLiteDatabase使用方法,感興趣的小伙伴們可以參考一下2016-05-05使用Kotlin開發(fā)Android應(yīng)用教程
這篇文章主要為大家詳細(xì)介紹了使用Kotlin開發(fā)Android應(yīng)用的教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05android之ContentResolver與ContentProvider介紹
這篇文章主要介紹了android之ContentResolver與ContentProvider介紹,需要的朋友可以參考下2016-01-01Android開發(fā)中使用sqlite實(shí)現(xiàn)新聞收藏和取消收藏的功能
本篇文章主要介紹了sqlite實(shí)現(xiàn)新聞收藏和取消收藏功能,主要涉及到oracle數(shù)據(jù)庫方面的內(nèi)容,對于Android開發(fā)sqlite實(shí)現(xiàn)收藏和取消功能感興趣的朋友可以參考下本文2016-11-11flutter開發(fā)技巧自定頁面指示器PageIndicator詳解
這篇文章主要為大家介紹了flutter開發(fā)技巧自定頁面指示器PageIndicator詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01