學(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開發(fā)重寫Animation實(shí)現(xiàn)下拉圖片后彈射回去效果示例
這篇文章主要介紹了Android開發(fā)重寫Animation實(shí)現(xiàn)下拉圖片后彈射回去效果,結(jié)合實(shí)例形式分析了Android自定義類繼承Animation實(shí)現(xiàn)圖片彈射效果的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Android RxJava創(chuàng)建操作符Timer的方法
這篇文章主要為大家詳細(xì)介紹了Android RxJava創(chuàng)建操作符Timer的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android中使用TextView實(shí)現(xiàn)文字跑馬燈效果
本文主要介紹了Android中使用TextView實(shí)現(xiàn)文字走馬燈效果的方法解析。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04
Android App中實(shí)現(xiàn)可以雙擊放大和縮小圖片功能的實(shí)例
這篇文章主要介紹了Android App中實(shí)現(xiàn)可以雙擊放大和縮小圖片功能的實(shí)例,文中的例子不能做到逐級放大但可以做到邊界控制和以觸摸點(diǎn)為中心進(jìn)行放大,需要的朋友可以參考下2016-03-03
Android 判斷當(dāng)前網(wǎng)絡(luò)是否可用簡單實(shí)例
這篇文章主要介紹了Android 判斷當(dāng)前網(wǎng)絡(luò)是否可用簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
Jetpack Compose之選擇器使用實(shí)例講解
這篇文章主要介紹了Jetpack Compose之選擇器使用,選擇器主要是指Checkbox復(fù)選框,單選開關(guān)Switch,滑桿組件Slider等用于提供給用戶選擇一些值和程序交互的組件,比如像復(fù)選框Checkbox,可以讓用戶選擇一個(gè)或者多個(gè)選項(xiàng)2023-04-04
Android源碼導(dǎo)入AndroidStudio或IntelliJ?IDEA的方法
這篇文章主要介紹了Android源碼導(dǎo)入AndroidStudio或IntelliJ?IDEA的方法,用idegen來生成針對AndroidStudio或IntelliJ?IDEA的Android系統(tǒng)源代碼工程配置文件,需要的朋友可以參考下2022-08-08
Android 中TextView的使用imageview被壓縮問題解決辦法
這篇文章主要介紹了Android 中TextView的使用imageview被壓縮問題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04

