天天看點

Android--Handler的使用方法:在子線程中更新界面

    handler一般有兩種用途:1)執行計劃任務,你可以再預定的實作執行某些任務,可以模拟定時器。2)線程間通信。在android的應用啟動時,會建立一個主線程,主線程會建立一個消息隊列來處理各種消息。當你建立子線程時,你可以再你的子線程中拿到父線程中建立的handler對象,就可以通過該對象向父線程的消息隊列發送消息了。由于android要求在ui線程中更新界面,是以,可以通過該方法在其它線程中更新界面。

◆ 通過runnable在子線程中更新界面的例子

Android--Handler的使用方法:在子線程中更新界面

在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對象可以再主線程中建立,也可以再子線程中建立。我們此處是在子線程中建立的。

Android--Handler的使用方法:在子線程中更新界面

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來更新界面。

Android--Handler的使用方法:在子線程中更新界面

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更新界面類似,隻是需要修改幾個地方。

Android--Handler的使用方法:在子線程中更新界面

實作自己的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

繼續閱讀