Android--Handler的使用方法:在子線程中更新介面
本文主要介紹Android的Handler的使用方法。Handler可以發送Messsage和Runnable對象到與其相關聯的線程的訊息佇列。每個Handler對象與建立它的線程相關聯,並且每個Handler對象只能與一個線程相關聯。
- Handler一般有兩種用途:1)執行計畫任務,你可以再預定的實現執行某些任務,可以類比定時器。2)線程間通訊。在Android的應用啟動時,會建立一個主線程,主線程會建立一個訊息佇列來處理各種訊息。當你建立子線程時,你可以再你的子線程中拿到父線程中建立的Handler對象,就可以通過該對象向父線程的訊息佇列發送訊息了。由於Android要求在UI線程中更新介面,因此,可以通過該方法在其它線程中更新介面。
◆ 通過Runnable在子線程中更新介面的例子
在onCreate中建立Handlerpublic class HandlerTestApp extends Activity { Handler mHandler; TextView mText; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mHandler = new Handler();//建立Handler mText = (TextView) findViewById(R.id.text0);//一個TextView }構建Runnable對象,在runnable中更新介面,此處,我們修改了TextView的文字.此處需要說明的是,Runnable對象可以再主線程中建立,也可以再子線程中建立。我們此處是在子線程中建立的。Runnable mRunnable0 = new Runnable() { @Override public void run() { // TODO Auto-generated method stub mText.setText("This is Update from ohter thread, Mouse DOWN"); } };
建立子線程,線上程的run函數中,我們向主線程的訊息佇列發送了一個runnable來更新介面。
private void updateUIByRunnable(){ new Thread() { //Message msg = mHandler.obtainMessage(); public void run() { //mText.setText("This is Update from ohter thread, Mouse DOWN");//這句將拋出異常 mHandler.post(mRunnable0); } }.start(); }
◆ 用Message在子線程中來更新介面
用Message更新介面與Runnable更新介面類似,只是需要修改幾個地方。實現自己的Handler,對訊息進行處理 private class MyHandler extends Handler { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch(msg.what) { case UPDATE://在收到訊息時,對介面進行更新 mText.setText("This update by message"); break; } } }在新的線程中發送訊息 private void updateByMessage() { //匿名對象 new Thread() { public void run() { //mText.setText("This is Update from ohter thread, Mouse DOWN"); //UPDATE是一個自己定義的整數,代表了訊息ID Message msg = mHandler.obtainMessage(UPDATE); mHandler.sendMessage(msg); } }.start(); }