Android 開發之多線程處理、Handler 詳解(2)

發表于:2013-05-28來源:intel software作者:Ternence Zhang點擊數: 標簽:Android
//當創建一個新的Handler實例時,它會綁定到當前線程和消息的隊列中,開始分發數據 // Handler有兩個作用, (1) :定時執行Message和Runnalbe對象 // (2):讓一個動作,在

  //當創建一個新的Handler實例時,它會綁定到當前線程和消息的隊列中,開始分發數據

  // Handler有兩個作用, (1) :定時執行Message和Runnalbe對象

  // (2):讓一個動作,在不同的線程中執行.

  //它安排消息,用以下方法

  // post(Runnable)

  // postAtTime(Runnable,long)

  // postDelayed(Runnable,long)

  // sendEmptyMessage(int)

  // sendMessage(Message);

  // sendMessageAtTime(Message,long)

  // sendMessageDelayed(Message,long)

  //以上方法以 post開頭的允許你處理Runnable對象

  //sendMessage()允許你處理Message對象(Message里可以包含數據,)

  MyThread m = new MyThread();

  new Thread(m).start();

  }

  /**

  *接受消息,處理消息 ,此Handler會與當前主線程一塊運行

  * */

  class MyHandler extends Handler {

  public MyHandler() {

  }

  public MyHandler(Looper L) {

  super(L);

  }

  //子類必須重寫此方法,接受數據

  @Override

  public void handleMessage(Message msg) {

  // TODO Auto-generated method stub

  Log.d("MyHandler", "handleMessage......");

  super.handleMessage(msg);

  //此處可以更新UI

  Bundle b = msg.getData();

  String color = b.getString("color");

  MyHandlerActivity.this.button.append(color);

  }

  }

  class MyThread implements Runnable {

  public void run() {

  try {

  Thread.sleep(10000);

  } catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  Log.d("thread.......", "mThread........");

  Message msg = new Message();

  Bundle b = new Bundle();//存放數據

  b.putString("color", "我的");

  msg.setData(b);

  MyHandlerActivity.this.myHandler.sendMessage(msg); //向Handler發送消息,更新UI

  }

  }

  }

  Looper

  其實Android中每一個Thread都跟著一個Looper,Looper可以幫助Thread維護一個消息隊列,昨天的問題 Can't create handler inside thread 錯誤 一文中提到這一概念,但是Looper和Handler沒有什么關系,我們從開源的代碼可以看到Android還提供了一個Thread繼承類HanderThread可以幫助我們處理,在HandlerThread對象中可以通過getLooper方法獲取一個Looper對象控制句柄,我們可以將其這個Looper對象映射到一個Handler中去來實現一個線程同步機制,Looper對象的執行需要初始化Looper.prepare方法就是昨天我們看到的問題,同時推出時還要釋放資源,使用Looper.release方法。

  Looper是MessageQueue的管理者。每一個MessageQueue都不能脫離Looper而存在,Looper對象的創建是通過prepare函數來實現的。同時每一個Looper對象和一個線程關聯。通過調用Looper.myLooper()可以獲得當前線程的Looper對象

  創建一個Looper對象時,會同時創建一個MessageQueue對象。除了主線程有默認的Looper,其他線程默認是沒有MessageQueue對象的,所以,不能接受Message。如需要接受,自己定義一個Looper對象(通過prepare函數),這樣該線程就有了自己的Looper對象和MessageQueue數據結構了。

  Looper從MessageQueue中取出Message然后,交由Handler的handleMessage進行處理。處理完成后,調用Message.recycle()將其放入Message Pool中。

  Message

  對于Android中Handler可以傳遞一些內容,通過Bundle對象可以封裝String、Integer以及Blob二進制對象,我們通過在線程中使用Handler對象的 sendEmptyMessage或sendMessage方法來傳遞一個Bundle對象到Handler處理器。對于Handler類提供了重寫方法handleMessage(Message msg) 來判斷,通過msg.what來區分每條信息。將Bundle解包來實現Handler類更新UI線程中的內容實現控件的刷新操作。相關的Handler對象有關消息發送sendXXXX相關方法如下,同時還有postXXXX相關方法,這些和Win32中的道理基本一致,一個為發送后直接返回,一個為處理后才返回。

  Message:消息對象,Message Queue中的存放的對象。一個Message Queue中包含多個Message。 Message實例對象的取得,通常使用Message類里的靜態方法obtain(),該方法有多個重載版本可供選擇;它的創建并不一定是直接創建一個新的實例,而是先從Message Pool(消息池)中看有沒有可用的Message實例,存在則直接取出返回這個實例。如果Message Pool中沒有可用的Message實例,則才用給定的參數創建一個Message對象。調用removeMessages()時,將Message從Message Queue中刪除,同時放入到Message Pool中。除了上面這種方式,也可以通過Handler對象的obtainMessage()獲取一個Message實例。

final boolean

原文轉自:http://software.intel.com/zh-cn/blogs/2013/05/08/android-handler/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20intelandroid%20%e2%80%93%20Handler

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97