前言:
無論是現在所做的專案還是以前的專案中,都會遇見執行緒之間通訊、元件之間通訊,目前統一採用EventBus來做處理,在總結學習EventBus之前,覺得還是需要學習總結一下最初的實現方式,也算是不忘初心吧,這也是今天來學習總結Handler訊息機制的一個原因。
訊息傳遞相關文章地址:
- Android訊息傳遞之Handler訊息機制
- Android訊息傳遞之元件間傳遞訊息
- Android訊息傳遞之EventBus 3.0使用詳解
- Android訊息傳遞之基於RxJava實現一個EventBus - RxBus
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