Android開發之道(10)Handler本質簡析與使用例項
Android 開發之道(10)Handler本質簡析與使用例項
- 作者:柳大·Poechant
- 郵箱:zhongchao.ustc@gmail.com
- 部落格:blog.csnd.net/poechang
- 日期:March 19th, 2012
1 Overview
先淺析本質太過抽象,還是先上 Handler 的最簡例項吧。
- 功能:
Android.os.Handler
負責接收,並按計劃傳送和處理訊息; - 特點:處理訊息是阻塞式的;
- 本質:關於
Handler
的內部機制,及其與Looper
的關係,請看本文的第三部分“訊息處理機制的本質”。
2 Get Started
2.1 先建立一個 Handler 物件,
private Handler mHandler = new Handler();
但這樣的Handler
是沒用的。不過先暫且不要管,往下面看。
2.2 向 Handler 的訊息佇列傳送資料
傳送資料的動作是通過 sendMessage 完成的。
Message message = new Message();
message.what = 1;
// 將訊息傳送到mHandler的訊息佇列的最後
mHandler.sendMessage(message);
不過實際上,在 Handler 內部有一個 Looper 類,而訊息佇列其實是 Looper 的一個成員。Handler 中的 mQueue 就是其成員 mLooper 的 mQueue。
2.3 處理訊息佇列中的資料
Handler 可以根據 Message 中的 what 值的不同來分發處理,Handler 中提供了 handleMessage 來讓開發人員進行 Override。示例如下:
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
// 所做的操作
break;
case 2:
// 所做的操作
break;
default:
// 所做的操作
}
};
完整的寫法,就是在建立 Handler 物件時如下:
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
// 所做的操作
break;
case 2:
// 所做的操作
break;
default:
// 所做的操作
}
};
}
2 計時器簡例
2.1 先建立一個任務類
Timer 和 TimerTask 是 Java 語言中的類,如果不熟悉,請看下面的例子及注視。
// 任務類
private class MyTask extends TimerTask{
@Override
public void run() {
// 建立要傳送的訊息
Message message = new Message();
message.what = 1;
// 將訊息傳送到mHandler的訊息佇列的最後
mHandler.sendMessage(message);
}
}
使用方法很簡單,就是用 Timer 來作為容器:
// 建立用於執行任務類的Timer
Timer timer = new Timer();
// 1毫秒之後開始每隔5秒鐘執行一次MyTast
timer.scheduleAtFixedRate(new MyTask(), 1, 1000);
2.2 完整的例子
佈局檔案就省略了,原始碼如下:
package com.sinosuperman.android;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class Test extends Activity {
//title為setTitle方法提供變數,這裡為了方便我設定成了int型
private int mSecs = 0;
private Handler mHandler = new Handler(){
// 根據mHandler的訊息佇列中的不同訊息進行處理
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
// 所做的操作
updateTitle();
break;
}
};
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 建立用於執行任務類的Timer
Timer timer = new Timer();
// 1毫秒之後開始每隔5秒鐘執行一次MyTast
timer.scheduleAtFixedRate(new MyTask(), 1, 1000);
}
// 任務類
private class MyTask extends TimerTask{
@Override
public void run() {
// 建立要傳送的訊息
Message message = new Message();
message.what = 1;
// 將訊息傳送到mHandler的訊息佇列的最後
mHandler.sendMessage(message);
}
}
// 處理訊息所做的操作
public void updateTitle(){
setTitle("Michael's Timer: " + mSecs);
mSecs++;
}
}
3 訊息處理機制的本質
3.1 Looper 與 Handler 的內部機制
Looper 中有一個 MessageQueue 的成員,Looper 中還有有一個 loop 函式用來對訊息佇列進行迴圈。Looper 並不直接與 Handler 繫結,我們可以直接“玩弄” Looper,不過 Handler 讓我們“玩弄”她更容易一些。
Handler 本質上是一個工具類,其內部有 Looper 成員。我們通過 Handler 類完成訊息的傳送和處理、制定分發機制等等。
3.2 訊息處理機制的本質
Handler 中封裝了 Looper 成員,Handler 中的訊息佇列就是 Looper 中的訊息佇列成員。Looper 中有訊息的迴圈分發機制。下面介紹下內部的大致流程:
- 當將一個訊息通過 sendMessage 交給 Handler 的時候,就是交給了 Looper;
- Looper 將訊息傳送到這個訊息指定的 target,而這個“指定”的動作是在 Handler 內部完成的,就是指定為 Handler 自己。
- Looper 將這個訊息傳送給 target 的 dispatchMessage 函式處理,因為 Handler 指定了 target 是自己,所以就是 Handler 的dispatchMessage 函式。
- dispatchMessage 函式對該訊息進行處理的時候,呼叫的是 handleMessage,就是由我們自己 override 的那個函式。
Reference
- http://weizhulin.blog.51cto.com/1556324/323922
- http://blog.csdn.net/Innost/article/details/6055793
-
轉載請註明來自“柳大·Poechant的CSDN部落格”:blog.CSDN.net/Poechant
-
相關文章
- Android Handler與Looper原理簡析AndroidOOP
- android移動開發簡單的開發例項Android移動開發
- Android RecyclerView 簡介與例項AndroidView
- Android開發之HandlerAndroid
- Qt繪圖淺析與例項QT繪圖
- 簡易型PDA的開發例項
- Android Handler的使用方式和注意事項Android
- Android Handler詳細使用方法例項Android
- 《JavaScript前端開發與例項教程(微課影片版)》簡介JavaScript前端
- Android 中Message,MessageQueue,Looper,Handler詳解+例項AndroidOOP
- Android 開發簡單記事本程式Android
- Android Studio1.4.x JNI開發基礎 - 簡單例項Android單例
- Android開發Handler原始碼分析Android原始碼
- android原生開發recyclerview基礎例項AndroidView
- 元件技術的本質COM例項分析一 (轉)元件
- Jndi使用好處,與簡單例項【Tomcat】單例Tomcat
- Android開發之FastJson概述與簡單使用AndroidASTJSON
- Android開發:ContentProvider例項詳解AndroidIDE
- Android uiautomator例項使用AndroidUI
- AWK簡介及使用例項
- Android的IPC機制(七)—— Socket的原理簡析與使用Android
- 淺析Android動畫(一),View動畫高階例項探究Android動畫View
- 策略模式與簡單java例項模式Java
- Android入門教程 | Handler,Looper與MessageQueue使用與分析AndroidOOP
- Qt5MV自定義模型與例項淺析QT模型
- Android中Handler的使用Android
- Android開發之ViewPager簡單使用AndroidViewpager
- PHP+jQuery開發簡單的翻牌抽獎例項PHPjQuery
- Qt自定義訊號槽的使用淺析+例項QT
- Memcached安裝與使用例項
- 網路爬蟲(四)Opener與Handler的介紹和例項應用爬蟲
- Android開發之道(4)程式框架基礎Android框架
- C#開發例項大全C#
- angular模組庫開發例項Angular
- jquery外掛開發例項jQuery
- ABAP 報表開發例項
- Hibernate(二):Hibernate搭建開發環境+簡單例項開發環境單例
- Android軟體開發方法淺析Android