• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            life02

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks
            http://blog.csdn.net/poechant/article/details/7371461

            Android 開發(fā)之道(10)Handler本質(zhì)簡析與使用實例

            • 作者:柳大·Poechant
            • 郵箱:zhongchao.ustc@gmail.com
            • 博客:blog.csnd.net/poechang
            • 日期:March 19th, 2012

            1 Overview

            先淺析本質(zhì)太過抽象,還是先上 Handler 的最簡實例吧。

            • 功能:Android.os.Handler負責接收,并按計劃發(fā)送和處理消息;
            • 特點:處理消息是阻塞式的;
            • 本質(zhì):關于Handler的內(nèi)部機制,及其與Looper的關系,請看本文的第三部分“消息處理機制的本質(zhì)”。

            2 Get Started

            2.1 先創(chuàng)建一個 Handler 對象,

            private Handler mHandler = new Handler();

            但這樣的Handler是沒用的。不過先暫且不要管,往下面看。

            2.2 向 Handler 的消息隊列發(fā)送數(shù)據(jù)

            發(fā)送數(shù)據(jù)的動作是通過 sendMessage 完成的。

            Message message = new Message();  
            message.what = 1;

            // 將消息發(fā)送到mHandler的消息隊列的最后
            mHandler.sendMessage(message);

            不過實際上,在 Handler 內(nèi)部有一個 Looper 類,而消息隊列其實是 Looper 的一個成員。Handler 中的 mQueue 就是其成員 mLooper 的 mQueue。

            2.3 處理消息隊列中的數(shù)據(jù)

            Handler 可以根據(jù) Message 中的 what 值的不同來分發(fā)處理,Handler 中提供了 handleMessage 來讓開發(fā)人員進行 Override。示例如下:

            public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
            // 所做的操作
            break;
            case 2:
            // 所做的操作
            break;
            default:
            // 所做的操作
            }
            };

            完整的寫法,就是在創(chuàng)建 Handler 對象時如下:

            private Handler mHandler = new Handler() {
            public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
            // 所做的操作
            break;
            case 2:
            // 所做的操作
            break;
            default:
            // 所做的操作
            }
            };
            }

            2 計時器簡例

            2.1 先創(chuàng)建一個任務類

            Timer 和 TimerTask 是 Java 語言中的類,如果不熟悉,請看下面的例子及注視。

            // 任務類
            private class MyTask extends TimerTask{
            @Override
            public void run() {
            // 創(chuàng)建要發(fā)送的消息
            Message message = new Message();
            message.what = 1;

            // 將消息發(fā)送到mHandler的消息隊列的最后
            mHandler.sendMessage(message);
            }
            }

            使用方法很簡單,就是用 Timer 來作為容器:

            // 創(chuàng)建用于執(zhí)行任務類的Timer
            Timer timer = new Timer();

            // 1毫秒之后開始每隔5秒鐘執(zhí)行一次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(){
            // 根據(jù)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);

            // 創(chuàng)建用于執(zhí)行任務類的Timer
            Timer timer = new Timer();

            // 1毫秒之后開始每隔5秒鐘執(zhí)行一次MyTast
            timer.scheduleAtFixedRate(new MyTask(), 1, 1000);
            }

            // 任務類
            private class MyTask extends TimerTask{
            @Override
            public void run() {

            // 創(chuàng)建要發(fā)送的消息
            Message message = new Message();
            message.what = 1;

            // 將消息發(fā)送到mHandler的消息隊列的最后
            mHandler.sendMessage(message);
            }
            }

            // 處理消息所做的操作
            public void updateTitle(){
            setTitle("Michael's Timer: " + mSecs);
            mSecs++;
            }
            }

            3 消息處理機制的本質(zhì)

            3.1 Looper 與 Handler 的內(nèi)部機制

            Looper 中有一個 MessageQueue 的成員,Looper 中還有有一個 loop 函數(shù)用來對消息隊列進行循環(huán)。Looper 并不直接與 Handler 綁定,我們可以直接“玩弄” Looper,不過 Handler 讓我們“玩弄”她更容易一些。

            Handler 本質(zhì)上是一個工具類,其內(nèi)部有 Looper 成員。我們通過 Handler 類完成消息的發(fā)送和處理、制定分發(fā)機制等等。

            3.2 消息處理機制的本質(zhì)

            Handler 中封裝了 Looper 成員,Handler 中的消息隊列就是 Looper 中的消息隊列成員。Looper 中有消息的循環(huán)分發(fā)機制。下面介紹下內(nèi)部的大致流程:

            1. 當將一個消息通過 sendMessage 交給 Handler 的時候,就是交給了 Looper;
            2. Looper 將消息發(fā)送到這個消息指定的 target,而這個“指定”的動作是在 Handler 內(nèi)部完成的,就是指定為 Handler 自己。
            3. Looper 將這個消息發(fā)送給 target 的 dispatchMessage 函數(shù)處理,因為 Handler 指定了 target 是自己,所以就是 Handler 的dispatchMessage 函數(shù)。
            4. dispatchMessage 函數(shù)對該消息進行處理的時候,調(diào)用的是 handleMessage,就是由我們自己 override 的那個函數(shù)。

            Reference

            1. http://weizhulin.blog.51cto.com/1556324/323922
            2. http://blog.csdn.net/Innost/article/details/6055793

            -

            轉(zhuǎn)載請注明來自“柳大·Poechant的CSDN博客”:blog.CSDN.net/Poechant

            posted on 2012-03-20 14:04 life02 閱讀(368) 評論(0)  編輯 收藏 引用 所屬分類: android組件學習
            91亚洲国产成人久久精品网址| 久久亚洲国产精品成人AV秋霞| www.久久热.com| 精品熟女少妇aⅴ免费久久| 开心久久婷婷综合中文字幕| 久久精品国产亚洲αv忘忧草 | 久久国产综合精品五月天| 久久99精品久久久久久水蜜桃| 久久精品卫校国产小美女| 久久se精品一区二区| 波多野结衣AV无码久久一区| 久久91精品国产91久久麻豆| 99久久香蕉国产线看观香| 久久久久中文字幕| 亚洲va久久久噜噜噜久久狠狠| 久久精品国产亚洲av瑜伽| 精品久久久久久亚洲| 一本久久知道综合久久| 久久久久免费视频| 精品国产一区二区三区久久| 久久无码中文字幕东京热| 国产一区二区精品久久岳| 久久久久亚洲AV片无码下载蜜桃| 久久丝袜精品中文字幕| 大伊人青草狠狠久久| 亚洲国产另类久久久精品小说| 久久天天躁狠狠躁夜夜2020一| 久久久久久久综合综合狠狠| 国产 亚洲 欧美 另类 久久| 日本精品久久久久中文字幕| 久久A级毛片免费观看| 久久亚洲国产成人精品性色| 久久久久久久精品成人热色戒| 亚洲午夜精品久久久久久浪潮| 久久精品国产亚洲一区二区三区| 97久久超碰国产精品2021| 久久久久久夜精品精品免费啦| 久久人人爽人人爽人人片AV不| 亚洲精品午夜国产VA久久成人 | 精品久久久久中文字幕一区| 91精品国产综合久久四虎久久无码一级 |