android的handler 是一個神奇東西,處理異步消息的時候,我們離不開他.那么他的具體的介紹是什么了?
Handler基本概念:
Handler主要用於異步消息的處理:當發出一個消息之后,首先進入一個消息隊列,發送消息的函數即刻返回,而另外一個部分逐個的在消息隊列中將消息取出,然后對消息進行出來,就是發送消息和接收消息不是同步的處理。 這種機制通常用來處理相對耗時比較長的操作。
對於handler的常用的一些方法有:
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post類方法允許你排列一個Runnable對象到主線程隊列中,
sendMessage類方法, 允許你安排一個帶數據的Message對象到隊列中,等待更新.
下面我們做一個小demo對handler有深一步的了解。
基本的業務描述是這樣的:我們要做一個耗時的操作,要將新的runnable接口放到主程隊列中。相應的源代碼如下:
1 package com.mp; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.os.Handler; 5 public class MyThread extends Activity { 6 private Handler handler = new Handler(); 7 @Override 8 public void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 handler.post(new MyRunnable()); 11 System.out.println("Oncreate---The Thread id is :" 12 + Thread.currentThread().getId()); 13 setContentView(R.layout.main); 14 } 15 private class MyRunnable implements Runnable { 16 public void run() { 17 System.out.println("Runnable---The Thread is running"); 18 System.out.println("Runnable---The Thread id is :" 19 + Thread.currentThread().getId()); 20 try { 21 Thread.sleep(6000); 22 } catch (InterruptedException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } 26 } 27 } 28 }
在這個demo中,整個過程如下:
程序已啟動,就把MyRunnable加入到消息隊列中,android的handler是異步機制,所以在handler.post(new MyRunnable()); 之后,程序會繼續執行,所以以后的語句會繼續,這時候我們輸出Oncreate中的當前線程ID。同時MyRunnable的run方法也在運行,一樣輸出run方法中的當前線程ID,然后讓線程休眠6秒。
demo的結果分析:
1:控制台的輸出: Oncreate---The Thread id is :1
Runnable---The Thread is running
Runnable---The Thread id is :1
2:程序啟動后6秒,我們才看到main.xml中的內容(只有一個textview)
這2個結果都表明handler和主線程是同一個線程。如果這時候你做的是一個耗時的操作(比如下載),那么這樣是不可行的。
於是,android給我們提供了Looper這樣一個類。其實Android中每一個Thread都跟着一個Looper,Looper可以幫助Thread維護一個消息隊列.、
這個demo 進一步告訴我們handler與looper之間的相互聯系.
