1. 程式人生 > >面試問到 Handler,這樣回答讓面試官大哥心服口服

面試問到 Handler,這樣回答讓面試官大哥心服口服

主要說一下Handler的作用,使用,原始碼分析,工作原理。

Handler的作用:

當我們需要在子執行緒處理耗時的操作(例如訪問網路,資料庫的操作),而當耗時的操作完成後,需要更新UI,這就需要使用Handler來處理,因為子執行緒不能做更新UI的操作。Handler能幫我們很容易的把任務(在子執行緒處理)切換回它所在的執行緒。簡單理解,Handler就是解決執行緒和執行緒之間的通訊的。

Handler的使用:

使用的handler的兩種形式: 
1.在主執行緒使用handler; 
2.在子執行緒使用handler。

在主執行緒使用handler的示例


   public class TestHandlerActivity extends AppCompatActivity {


        private static final String TAG = "TestHandlerActivity";

        private Handler mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //獲得剛才傳送的Message物件,然後在這裡進行UI操作
                Log.e(TAG,"------------> msg.what = " + msg.what);
            }
        };


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_handler_test);
            initData();
        }

        private void initData() {

            //開啟一個執行緒模擬處理耗時的操作
            new Thread(new Runnable() {
                @Override
                public void run() {

                    SystemClock.sleep(2000);
                    //通過Handler傳送一個訊息切換回主執行緒(mHandler所在的執行緒)
                    mHandler.sendEmptyMessage(0);
                }
            }).start();

        }  

在主執行緒使用handler很簡單,只需在主執行緒建立一個handler物件,在子執行緒通過在主執行緒建立的handler物件傳送Message,在handleMessage()方法中接受這個Message物件進行處理。通過handler很容易的從子執行緒切換回主執行緒了。

那麼來看看在子執行緒中使用是否也是如此。

 public class TestHandlerActivity extends AppCompatActivity {


        private static final String TAG = "TestHandlerActivity";

        //主執行緒的Handler
        private Handler mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //獲得剛才傳送的Message物件,然後在這裡進行UI操作
                Log.e(TAG,"------------> msg.what = " + msg.what);
            }
        };
        //子執行緒中的Handler
        private Handler mHandlerThread = null;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_handler_test);
            initData();
        }

        private void initData() {

            //開啟一個執行緒模擬處理耗時的操作
            new Thread(new Runnable() {
                @Override
                public void run() {

                    SystemClock.sleep(2000);
                    //通過Handler傳送一個訊息切換回主執行緒(mHandler所在的執行緒)
                    mHandler.sendEmptyMessage(0);

                    //呼叫Looper.prepare()方法
                    Looper.prepare();

                    mHandlerThread = new Handler(){
                        @Override
                        public void handleMessage(Message msg) {
                            super.handleMessage(msg);
                            Log.e("sub thread","---------> msg.what = " + msg.what);
                        }
                    };

                    mHandlerThread.sendEmptyMessage(1);

                    //呼叫Looper.loop()方法
                    Looper.loop();
                }
            }).start();

        }

可以看到,通過呼叫Looper.prepare()執行正常,handleMessage方法中就可以接收到傳送的Message。

至於為什麼要呼叫這個方法呢?去看看原始碼。

Handler的原始碼分析:

Handler的訊息處理主要有五個部分組成,Message,Handler,Message Queue,Looper和ThreadLocal。首先簡要的瞭解這些物件的概念

Message:Message是線上程之間傳遞的訊息,它可以在內部攜帶少量的資料,用於執行緒之間交換資料。Message有四個常用的欄位,what欄位,arg1欄位,arg2欄位,obj欄位。what,arg1,arg2可以攜帶整型資料,obj可以攜帶object物件。

Handler:它主要用於傳送和處理訊息的傳送訊息一般使用sendMessage()方法,還有其他的一系列sendXXX的方法,但最終都是呼叫了sendMessageAtTime方法,除了sendMessageAtFrontOfQueue()這個方法

而發出的訊息經過一系列的輾轉處理後,最終會傳遞到Handler的handleMessage方法中。

Message Queue:MessageQueue是訊息佇列的意思,它主要用於存放所有通過Handler傳送的訊息,這部分的訊息會一直存在於訊息佇列中,等待被處理。每個執行緒中只會有一個MessageQueue物件。

Looper:每個執行緒通過Handler傳送的訊息都儲存在,MessageQueue中,Looper通過呼叫loop()的方法,就會進入到一個無限迴圈當中,然後每當發現Message Queue中存在一條訊息,就會將它取出,並傳遞到Handler的handleMessage()方法中。每個執行緒中只會有一個Looper物件。

ThreadLocal:MessageQueue物件,和Looper物件在每個執行緒中都只會有一個物件,怎麼能保證它只有一個物件,就通過ThreadLocal來儲存。Thread Local是一個執行緒內部的資料儲存類,通過它可以在指定執行緒中儲存資料,資料儲存以後,只有在指定執行緒中可以獲取到儲存到資料,對於其他執行緒來說則無法獲取到資料。


相關推薦

面試問到 Handler這樣回答面試大哥心服口服

主要說一下Handler的作用,使用,原始碼分析,工作原理。Handler的作用:當我們需要在子執行緒處理耗時的操作(例如訪問網路,資料庫的操作),而當耗時的操作完成後,需要更新UI,這就需要使用Handler來處理,因為子執行緒不能做更新UI的操作。Handler能幫我們很

【Spring註解驅動開發】如何實現方法、構造器位置的自動裝配?我這樣回答面試很滿意!

## 寫在前面 > 在 **冰河技術** 微信公眾號前面的文章中,我們介紹瞭如何使用註解來自動裝配Spring元件。之前將的都是在來的欄位上添加註解,那有沒有什麼方法可以實現方法、構造器位置的自動裝配嗎?今天我們就一起來探討下如何實現方法、構造器位置的自動裝配。 > > 關注 **冰河技術*

同樣的試題怎樣回答可以面試一次就記住你!

=======常見面試題:送分主觀題======= 1、請簡述一下Bug週期?  這個題簡直就是送分題。 但,拍拍你聰明的腦袋,你都知道這個題很簡單,看到就可以脫口而出; 但,再拍拍你聰明的腦袋,不

Tomcat相關試題看這篇就夠了!保證能面試顫抖!

Tomcat相關的面試題出場的機率並不高,正式因為如此,很多人忽略了對Tomcat相關技能的掌握。 這次整理了Tomcat相關

現在越來越喜歡用ajax傳值了這樣網站的體驗性很好今天就總結了一下常用的

click put nbsp index.php 常用 體驗 code size .get 這是不用循環的方法 就是傳過來的是一位數組 //編輯黨建分類 function gk_bj(id){ $.post("{:U(‘Luser/lei_edlt

四張圖帶你瞭解Tomcat系統架構--面試顫抖的Tomcat回答系列!

<div class="markdown_views prism-atom-one-dark">                             <!-- flowchart 箭頭圖示 勿刪 -->                       

「阿里面試系列」分析Synchronized原理面試仰望

JAVA架構 2018-12-18 08:01:00 文章簡介 synchronized想必大家都不陌生,用來解決執行緒安全問題的利器。同時也是Java高階程式設計師面試比較常見的面試題。這篇文正會帶大家徹底瞭解synchronized的實現。 擴充套件閱讀: 「阿里面試系

「產品體驗報告」怎麼做才能面試“非你不可”?

最近小強正在瘋狂地找產品工作,海投簡歷的公司數不勝數,好不容易有一家企業發來了面試邀請,結果第一

HR問上家薪資這樣回答最安全!

HR問你上家公司的薪水,如實說,你會不會擔心她壓價,不給你想要的薪酬?如果說高了,HR要你開薪資證明神馬的,不符會覺得你撒謊,你說到底該怎麼辦? 前程無憂網友“kloe”的困惑: HR為什麼總是非要糾纏於“上家公司薪水”的問題?現在的公司都有薪酬保密制度,對內對外都要嚴格

怎麼回答“分散式架構”才能面試滿意?

簡介 作為一名架構師,我們要專業,要能看懂程式碼,及時光著臂膀去機房,也能獨擋一面!及時同事搞不定問題,或者撂挑子,你也能給老大一個堅定的眼神:不怕,有我在!還能在會議室上滔滔不絕,如若無人,讓不懂技術的妹子看你時眼神迷離,就好想落霞與孤鶩齊飛! 分散式架構是一個非常複雜

面試Java高階開發崗位只需準備這幾點面試心服口服

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

試問建立多少個執行緒合適?我該怎麼說

| **如果好看,請給個贊** > - 你有一個思想,我有一個思想,我們交換後,一個人就有兩個思想 > > - If you can NOT explain it simply, you do NOT understand it well enough 現陸續將Demo程式碼和技術文

如何設定執行緒池引數?美團給出了一個面試虎軀一震的回答

前言:曾經自詡對執行緒池瞭如指掌,不料看了美團的一篇技術文章後才知道原來執行緒池的引數還可以動態調節。 學藝不精,一邊留下了沒有技術的淚水,一邊站在美團這個巨人的肩上寫下此文,補充並記錄了自己的一點看法。 分享給大家,希望能對你有所幫助。 荒腔走板 大家好,我是 why,一個四川好男人。 今天本來應該是武

同步非同步多執行緒這三者關係你能給面試一個滿意的回答嗎?

前幾天一位朋友去面試,面試官問了他同步,非同步,多執行緒之間是什麼關係,非同步比同步高效在哪?多執行緒比單執行緒高效在哪?由於回答的不好,讓我幫他捋一下,其實回答這個問題不難,難就難在只對別人說理論,而沒有現殺的例子。 一:非同步 1. 到底解放了誰? <1> 從基礎的同步說起 要說解放了誰,一定

面試顫抖的Tomcat系統架構系列!

版本 所有 http 開始 生命周期 fff rac 基本 docs 前言 俗話說,站在巨人的肩膀上看世界,一般學習的時候也是先總覽一下整體,然後逐個部分個個擊破,最後形成思路,了解具體細節,Tomcat的結構很復雜,但是 Tomcat 非常的模塊化,找到了 Tomcat最

跳個槽竟然還要被面試問這種問題!

       明明自己有一定的工作經驗,但是在面試的時候還是會被問道一些“奇奇怪怪”的,和工作內容並沒多大關係的問題,這可該怎麼辦?       Evergreen:請問如果面試的

《PHP程式設計師面試筆試寶典》——如果面試問題曾經遇見過是否要告知面試

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 面試中,大多數題目都不是憑空想象出來的,而是有章可循,只要求職者肯花時間,耐得住寂寞,複習得當,基本上在面試前都會見過相同的或者類似的問題(當然,很多知名企業每年都會推陳出新,這些題目是很難完全複習到位的)。所以,在面試中,求職者曾經

PHP面試技巧——如果面試問題曾經遇見過是否要告知面試

如何巧妙地回答面試官的問題? 本文摘自《PHP程式設計師面試筆試寶典》 面試中,大多數題目都不是憑空想象出來的,而是有章可循,只要求職者肯花時間,耐得住寂寞,複習得當,基本上在面試前都會見過相同的或者類似的問題(當然,很多知名企業每年都會推陳出新,這些題目是很難完全複習到位的)。所以,在面試

Java程序員如何在面試時短時間內面試刮目相看?

並發編程 ima 引擎 安全性 版本控制工具 核心api 奇怪 整理 自己 前言 技術面試是每一位程序員都會經歷的一件事情,技術面試官會通過自己的方式去考察程序員的技術功底與基礎理論知識,這個過程被有的程序員成為“造火箭式的技術轟炸”,不同程序員的面試經歷與體驗也是千差萬別

什麽樣的項目經歷會面試眼前一亮

zook 技術交流 分布 優秀 練習 同時 net 增刪改 非主流 圖書管理系統、教務選課系統的主要技術是數據庫操作技術,就是數據庫的增刪改查操作,在面試官看來並沒有什麽技術含量。這些系統的關鍵在於業務流程,而不是技術。如果這些系統是你“真正”參與的“真實”的兼職項目,那