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

來源:互聯網
上載者:User

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

本文主要介紹Android的Handler的使用方法。Handler可以發送Messsage和Runnable對象到與其相關聯的線程的訊息佇列。每個Handler對象與建立它的線程相關聯,並且每個Handler對象只能與一個線程相關聯。

  1. 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();     }

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.