Android訊息傳遞之Handler訊息機制(一)

來源:互聯網
上載者:User

標籤:

前言:

      無論是現在所做的項目還是以前的項目中,都會遇見線程之間通訊、組件之間通訊,目前統一採用EventBus來做處理,在總結學習EventBus之前,覺得還是需要學習總結一下最初的實現方式,也算是不忘初心吧,這也是今天來學習總結Handler訊息機制的一個原因。

Handler機制產生背景

      一個Android應用程式被建立的時候都會建立一個UI主線程,但是有時我們會有一些比較耗時的操作,為了防止阻塞UI主線程,我們會將耗時的操作放到子線程中進行處理,處理完之後操作UI,但是Android不允許子線程操作UI,違背了Android單執行緒模式的原則(即 Android UI操作並不是安全執行緒的並且這些操作必須在UI線程中執行),所以Android通過Handler訊息機制來實現線程之間的通訊。

Handler機制主要角色

    Message:訊息,其中包含了訊息ID,訊息處理對象以及處理的資料等,由MessageQueue統一列隊,終由Handler處理。 

    Handler:處理者,負責Message的發送及處理。使用Handler時,需要實現handleMessage(Message msg)方法來對特定的Message進行處理,例如更新UI等。 

    MessageQueue:訊息佇列,用來存放Handler發送過來的訊息,並按照FIFO規則執行。當然,存放Message並非實際意義的儲存,而是將Message以鏈表的方式串聯起來的,等待Looper的抽取。 

    Looper:訊息泵,不斷地從MessageQueue中抽取Message執行。因此,一個MessageQueue需要一個Looper。 

    Thread:線程,負責調度整個訊息迴圈,即訊息迴圈的執行場所。

Handler機制主要運用    1.) 發送訊息,在不同的線程間發送訊息,使用的方法為sendXXX();
sendEmptyMessage(int);//發送一個空的訊息sendMessage(Message);//發送訊息,訊息中可以攜帶參數sendMessageAtTime(Message, long);//未來某一時間點發送訊息sendMessageDelayed(Message, long);//延時Nms發送訊息

 舉例:

 主線程定義Handler

  Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case 0:                    //完成主介面更新,拿到資料                    String data = (String) msg.obj;                    textView.setText(data);                    break;                default:                    break;            }        }    };

子線程發訊息,通知Handler完成UI更新

    private void getDataFromNet() {        new Thread(new Runnable() {            @Override            public void run() {                //耗時操作,完成之後發送訊息給Handler,完成UI更新;                mHandler.sendEmptyMessage(0);                //需要資料傳遞,用下面方法;                Message msg = new Message();                msg.obj = "網路資料";//可以是基本類型,可以是對象,可以是List、map等;                mHandler.sendMessage(msg);            }        }).start();    }
2.) 計劃任務,在未來執行某任務,使用的方法為postXXX() ;
post(Runnable);//提交計劃任務馬上執行postAtTime(Runnable, long);//提交計劃任務在未來的時間點執行postDelayed(Runnable, long);//提交計劃任務延時Nms執行

樣本:

主線程定義Handler

  private Handler mHandler=new Handler();

子線程提交任務更新UI

    private void getDataFromNet() {        new Thread(new Runnable() {            @Override            public void run() {                //耗時操作,完成之後提交任務更新UI                final String data = "網路資料";                mHandler.post(new Runnable() {                    @Override                    public void run() {                        textView.setText(data);                    }                });            }        }).start();    }
Handler機制擴充

    為了更加方便的使用Handler訊息機制,Android也提供了幾種擴充方式,內部實現都是基於Handler訊息機制

  1.)  Activity.runOnUiThread(Runnable)
    private void getDataFromNet() {        new Thread(new Runnable() {            @Override            public void run() {                //耗時操作,完成之後提交任務更新UI                final String data = "網路資料";                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        textView.setText(data);                    }                });            }        }).start();    }
2 .)View.post(Runnable)
   private void getDataFromNet() {        new Thread(new Runnable() {            @Override            public void run() {                //耗時操作,完成之後提交任務更新UI                final String data = "網路資料";                textView.post(new Runnable() {                    @Override                    public void run() {                        textView.setText(data);                    }                });            }        }).start();    }

5.)使用AsyncTask代替Thread

    private void getDataFromNet() {        MyTask task = new MyTask();        task.execute();    }    private class MyTask extends AsyncTask {        //後台線程執行時        @Override        protected Object doInBackground(Object... params) {            ////耗時操作,            String data = "網路資料";            return data;        }        //後台線程執行結束後的操作,其中參數result為doInBackground返回的結果        @Override        protected void onPostExecute(Object result) {            super.onPostExecute(result);            textView.setText((String) result);        }    }

小結:

    至此Handler訊息簡單的總結到此結束,更多內部具體實現可以參考

   1.http://www.cnblogs.com/angeldevil/p/3340644.html

   2.http://blog.csdn.net/fei0724/article/details/8664462

 

Android訊息傳遞之Handler訊息機制(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.