標籤:
Android只允許UI線程修改Activity裡的UI組件。當Android程式第一次啟動時,Android會同時啟動一條主線程(Main Thread),主線程主要負責處理與UI相關的事件,如使用者的按鍵事件、螢幕繪圖事件,並把相關的事件分發到對應的組件進行處理。所以,主線程通常又被稱為UI線程。Android只允許UI線程修改Activity裡的UI組件,這樣會導致新啟動的線程無法動態改變介面組件的屬性值。但在實際的Android程式開發中,尤其是涉及動畫的遊戲開發中,需要讓新啟動的線程周期性的改變介面組件的屬性值,這就需要藉助於Handler的訊息傳遞機制來實現了。1 Handler類簡介Handler類的主要作用有兩個:(1)在新啟動的線程中發送訊息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);}其實,sendMessage(Message msg) 和sendEmptyMessage(int what) 實際上是一樣的,一個傳Message類型的msg,一個傳int類型的what,傳what的,最終會轉為msg。(2)在主線程中擷取、處理訊息public void handleMessage(Message msg)2 使用執行個體下面使用Handler以及Timer類實現時間的自動重新整理
public class MainActivity extends Activity {@Overrideprotected 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(){@Overridepublic void handleMessage(Message msg){if(msg.what==0x12){txt.setText("目前時間:"+new java.util.Date());}}};Button btn=(Button)findViewById(R.id.btn);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubnew Timer().schedule(new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stubmyHandler.sendEmptyMessage(0x12);}}, 0,1000);}});}@Overridepublic 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;}}
Android學習之Handler訊息傳遞機制