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

發表于:2013-05-28來源:intel software作者:Ternence Zhang點擊數: 標簽:Android
Android開發過程中為什么要多線程 我們創建的Service、Activity以及Broadcast均是一個主線程處理,這里我們可以理解為UI線程。但是在操作一些耗時操作時,比如I/O讀寫的大文件讀寫,數據庫操作以及網絡下載需要很長時間,為了不阻塞用戶界面,出現ANR

  Android開發過程中為什么要多線程

  我們創建的Service、Activity以及Broadcast均是一個主線程處理,這里我們可以理解為UI線程。但是在操作一些耗時操作時,比如I/O讀寫的大文件讀寫,數據庫操作以及網絡下載需要很長時間,為了不阻塞用戶界面,出現ANR的響應提示窗口,這個時候我們可以考慮使用Thread線程來解決。

  Android中使用Thread線程會遇到哪些問題

  對于從事過J2ME開發的程序員來說Thread比較簡單,直接匿名創建重寫run方法,調用start方法執行即可?;蛘邚腞unnable接口繼承,但對于Android平臺來說UI控件都沒有設計成為線程安全類型,所以需要引入一些同步的機制來使其刷新,這點Google在設計Android時倒是參考了下Win32的消息處理機制。

  postInvalidate()方法

  對于線程中的刷新一個View為基類的界面,可以使用postInvalidate()方法在線程中來處理,其中還提供了一些重寫方法比如postInvalidate(int left,int top,int right,int bottom) 來刷新一個矩形區域,以及延時執行,比如postInvalidateDelayed(long delayMilliseconds)或postInvalidateDelayed(long delayMilliseconds,int left,int top,int right,int bottom) 方法,其中第一個參數為毫秒,如下:

void

postInvalidate()

void

postInvalidate(int left, int top, int right, int bottom)

void

postInvalidateDelayed(long delayMilliseconds)

void

postInvalidateDelayed(long delayMilliseconds, int left, int top, int right, int bottom)

  Handler

  當然推薦的方法是通過一個Handler來處理這些,可以在一個線程的run方法中調用handler對象的postMessage或sendMessage方法來實現,Android程序內部維護著一個消息隊列,會輪訓處理這些,如果你是Win32程序員可以很好理解這些消息處理,不過相對于Android來說沒有提供PreTranslateMessage這些干涉內部的方法。

  消息的處理者,handler負責將需要傳遞的信息封裝成Message,通過調用handler對象的obtainMessage()來實現。將消息傳遞給Looper,這是通過handler對象的sendMessage()來實現的。繼而由Looper將Message放入MessageQueue中。當Looper對象看到MessageQueue中含有Message,就將其廣播出去。該handler對象收到該消息后,調用相應的handler對象的handleMessage()方法對其進行處理。

  Handler主要接受子線程發送的數據,并用此數據配合主線程更新UI.

  當應用程序啟動時,Android首先會開啟一個主線程 (也就是UI線程) , 主線程為管理界面中的UI控件,進行事件分發,比如說,你要是點擊一個 Button ,Android會分發事件到Button上,來響應你的操作。 如果此時需要一個耗時的操作,例如:聯網讀取數據, 或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,,如果你放在主線程中的話,界面會出現假死現象,如果5秒鐘還沒有完成的話,,會收到Android系統的一個錯誤提示 "強制關閉". 這個時候我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險的.這個時候,Handler就出現了,來解決這個復雜的問題, 由于Handler運行在主線程中(UI線程中), 它與子線程可以通過Message對象來傳遞數據,這個時候,Handler就承擔著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(里面包含數據) ,把這些消息放入主線程隊列中,配合主線程進行更新UI。

  Handler一些特點:handler可以分發Message對象和Runnable對象到主線程中,每個Handler實例,都會綁定到創建他的線程中(一般是位于主線程),

  它有兩個作用: (1)安排消息或Runnable在某個主線程中某個地方執行

  (2)安排一個動作在不同的線程中執行

  Handler中分發消息的一些方法

  post(Runnable)

  postAtTime(Runnable,long)

  postDelayed(Runnable long)

  sendEmptyMessage(int)

  sendMessage(Message)

  sendMessageAtTime(Message,long)

  sendMessageDelayed(Message,long)

  以上post類方法允許你排列一個Runnable對象到主線程隊列中,sendMessage類方法,允許你安排一個帶數據的Message對象到隊列中,等待更新.

  Handler實例

  // 子類需要繼承Hendler類,并重寫handleMessage(Message msg) 方法,用于接受線程數據

  // 以下為一個實例,它實現的功能為 :通過線程修改界面Button的內容

  public class MyHandlerActivity extends Activity {

  Button button;

  MyHandler myHandler;

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentview(R.layout.handlertest);

  button = (Button) findViewById(R.id.button);

  myHandler = new MyHandler();

原文轉自: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