handler一般有兩種用途:1)執行計劃任務,你可以再預定的實作執行某些任務,可以模拟定時器。2)線程間通信。在android的應用啟動時,會建立一個主線程,主線程會建立一個消息隊列來處理各種消息。當你建立子線程時,你可以再你的子線程中拿到父線程中建立的handler對象,就可以通過該對象向父線程的消息隊列發送消息了。由于android要求在ui線程中更新界面,是以,可以通過該方法在其它線程中更新界面。
◆ 通過runnable在子線程中更新界面的例子
在oncreate中建立handler
public 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();
轉載:http://blog.csdn.net/chaoyu168/article/details/50914021