android的handler 是一個神奇東西,處理異步消息的時候,咱們離不開他.那麼他的具體的介紹是什麼了?android
Handler基本概念:
Handler主要用於異步消息的處理:當發出一個消息以後,首先進入一個消息隊列,發送消息的函數即刻返回,而另一個部分逐個的在消息隊列中將消息取出,而後對消息進行出來,就是發送消息和接收消息不是同步的處理。 這種機制一般用來處理相對耗時比較長的操做。web
對於handler的經常使用的一些方法有:app
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)異步
以上post類方法容許你排列一個Runnable對象到主線程隊列中,
sendMessage類方法, 容許你安排一個帶數據的Message對象到隊列中,等待更新.ide
下面咱們作一個小demo對handler有深一步的瞭解。函數
基本的業務描述是這樣的:咱們要作一個耗時的操做,要將新的runnable接口放到主程隊列中。相應的源代碼以下:oop
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維護一個消息隊列.、post
這個demo 進一步告訴咱們handler與looper之間的相互聯繫. spa