導航:首頁 > 操作系統 > androidhandler原理

androidhandler原理

發布時間:2022-08-15 01:36:45

android handler和非同步任務有什麼區別

其實handler與非同步任務沒有可比性,您的基礎還需要加強。下面這篇csdn的博客中有handler的詳細介紹,
http://blog.csdn.net/androidwuyou/article/details/52601498

AsyncTask實現的原理和適用的優缺點
AsyncTask,是android提供的輕量級的非同步類,可以直接繼承AsyncTask,在類中實現非同步操作,並提供介面反饋當前非同步執行的程度(可以通過介面實現UI進度更新),最後反饋執行的結果給UI主線程.
使用的優點:
簡單,快捷
過程可控
使用的缺點:
在使用多個非同步操作和並需要進行Ui變更時,就變得復雜起來.

Handler非同步實現的原理和適用的優缺點
在Handler 非同步實現時,涉及到 Handler, Looper, Message,Thread四個對象,實現非同步的流程是主線程啟動Thread(子線程)運行並生成Message-Looper獲取Message並傳遞給HandlerHandler逐個獲取Looper中的Message,並進行UI變更。
使用的優點:
結構清晰,功能定義明確
對於多個後台任務時,簡單,清晰
使用的缺點:
在單個後台非同步處理時,顯得代碼過多,結構過於復雜(相對性)

AsyncTask介紹

Android的AsyncTask比Handler更輕量級一些(只是代碼上輕量一些,而實際上要比handler更耗資源),適用於簡單的非同步處理。
首先明確Android之所以有Handler和AsyncTask,都是為了不阻塞主線程(UI線程),且UI的更新只能在主線程中完成,因此非同步處理是不可避免的。

Android為了降低這個開發難度,提供了AsyncTask。AsyncTask就是一個封裝過的後台任務類,顧名思義就是非同步任務。
AsyncTask直接繼承於Object類,位置為android.os.AsyncTask。要使用AsyncTask工作我們要提供三個泛型參數,並重載幾個方法(至少重載一個)。

AsyncTask定義了三種泛型類型 Params,Progress和Result。
Params 啟動任務執行的輸入參數,比如HTTP請求的URL。
Progress 後台任務執行的百分比。
Result 後台執行任務最終返回的結果,比如String。
使用過AsyncTask 的同學都知道一個非同步載入數據最少要重寫以下這兩個方法:
doInBackground(Params…) 後台執行,比較耗時的操作都可以放在這里。注意這里不能直接操作UI。此方法在後台線程執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress…)來更新任務的進度。
onPostExecute(Result) 相當於Handler 處理UI的方式,在這裡面可以使用在doInBackground 得到的結果處理操作UI。 此方法在主線程執行,任務執行的結果作為此方法的參數返回
有必要的話你還得重寫以下這三個方法,但不是必須的:
onProgressUpdate(Progress…) 可以使用進度條增加用戶體驗度。 此方法在主線程執行,用於顯示任務執行的進度。
onPreExecute() 這里是最終用戶調用Excute時的介面,當任務執行之前開始調用此方法,可以在這里顯示進度對話框。
onCancelled() 用戶調用取消時,要做的操作
使用AsyncTask類,以下是幾條必須遵守的准則:
Task的實例必須在UI thread中創建;
execute方法必須在UI thread中調用;
不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法;
該task只能被執行一次,否則多次調用時將會出現異常;
Handler介紹
一、 Handler主要接受子線程發送的數據, 並用此數據配合主線程更新UI.
當應用程序啟動時,Android首先會開啟一個主線程, 主線程為管理界面中的UI控制項,進行事件分發,更新UI只能在主線程中更新,子線程中操作是危險的。這個時候,Handler就需要出來解決這個復雜的問題。由於Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞數據, 這個時候,Handler就承擔著接受子線程傳過來的(子線程用sedMessage()方法傳遞)Message對象(裡麵包含數據), 把這些消息放入主線程隊列中,配合主線程進行更新UI。
二、Handler的特點
Handler可以分發Message對象和Runnable對象到主線程中, 每個Handler實例,都會綁定到創建他的線程中,
它有兩個作用:
(1)安排消息或Runnable 在某個主線程中某個地方執行
(2)安排一個動作在不同的線程中執行
Handler中分發消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post類方法允許你排列一個Runnable對象到主線程隊列中,
sendMessage類方法, 允許你安排一個帶數據的Message對象到隊列中,等待更新.

Ⅱ 如何生動形象的理解Android Handler消息處理機制

在一個Android 程序開始運行的時候,會單獨啟動一個Process。默認的情況下,所有這個程序中的Activity,Service,Content Provider,Broadcast Receiver(Android 4大組件)都會跑在這個Process。一個Android 程序默認情況下也只有一個Process,但一個Process下卻可以有許多個Thread。在這么多Thread當中,有一個Thread,稱之為UI Thread。UI Thread在Android程序運行的時候就被創建,是一個Process當中的主線程Main Thread,主要是負責控制UI界面的顯示、更新和控制項交互。在Android程序創建之初,一個Process呈現的是單線程模型,所有的任務都在一個線程中運行。因此,UI Thread所執行的每一個函數,所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網路,下載數據,查詢資料庫等),都應該交由子線程去執行,以免阻塞主線程,導致ANR。那麼問題來了,UI 主線程和子線程是怎麼通信的呢。這就要提到這里要講的Handler機制。
簡單來說,handler機制被引入的目的就是為了實現線程間通信的。handler一共幹了兩件事:在子線程中發出message,在主線程中獲取、處理message。聽起來好像so easy,如果面試中讓闡述下Handler機制,這么回答顯然不是面試官想要的答案。忽略了一個最重要的問題:子線程何時發送message,主線程何時獲取處理message。
為了能讓主線程「適時」得處理子線程所發送的message,顯然只能通過回調的方式來實現——開發者只要重寫Handler類中處理消息的方法,當子線程發送消時,Handler類中處理消息的方法就會被自動回調。
Handler類包含如下方法用於發送處理消息
void handleMessage(Message msg):處理消息的方法,該方法通常用於被重寫。
final boolean hasMessage(int what):檢查消息隊列中是否包含what屬性為指定值的消息。
final boolean hasMessage(int what,Object object):檢查消息隊列中是否包含what屬性為指定值且object屬性為指定對象的消息。
sendEmptyMessage(int what)發送空消息。
sendEmptyMessageDelayed(int what,longdelayMillis);指定多少毫秒之後發送空消息。
sendMessage(Message msg)立即發送消息。
sendMessageDelayed(int what,longdelayMillis);指定多少毫秒之後發送消息。
藉助以上方法,就可以自由穿梭於主線程和子線程之中了。
到這里就結束了么?當然沒有。要講的東西才剛剛開始,要知道消息處理這件事,不是handler一個人在戰斗,android的消息處理有三個核心類:Handler,Looper,和Message。其實還有一個MessageQueue(消息隊列),但是Message Queue被封裝到Looper裡面了,不會直接與Message Queue打交道。
Looper的字面意思是「循環裝置」,它被設計用來使一個普通線程變成Looper線程。所謂Looper線程就是循環工作的線程。在程序開發中,經常會需要一個線程不斷循環,一旦有新任務則執行,執行完繼續等待下一個任務,這就是Looper線程。Looper是用於給一個線程添加一個消息隊列(MessageQueue),並且循環等待,當有消息時會喚起線程來處理消息的一個工具,直到線程結束為止。通常情況下不會用到Looper,因為對於Activity,Service等系統組件,Frameworks已經為初始化好了線程(俗稱的UI線程或主線程),在其內含有一個Looper,和由Looper創建的消息隊列,所以主線程會一直運行,處理用戶事件,直到某些事件(BACK)退出。
如果,需要新建一個線程,並且這個線程要能夠循環處理其他線程發來的消息事件,或者需要長期與其他線程進行復雜的交互,這時就需要用到Looper來給線程建立消息隊列。
使用Looper也非常的簡單,它的方法比較少,最主要的有四個:
public static prepare();為線程初始化消息隊列。
public static myLooper();獲取此Looper對象的引用
public static loop();讓線程的消息隊列開始運行,可以接收消息了。
public void quit();退出具體哪個Looper
在整個消息處理機制中,message又叫task,封裝了任務攜帶的信息和處理該任務的handler,這個很好理解,就不做介紹了。
說了這么多,一定沒聽太明白。沒關系,再對Handler運行機製做個總結:
子線程(無looper)借用主線程(有looper)里的Hander發送一條message到主線程,這個message會被主線程放入message queue,主線程裡面有一個looper,在輪詢message queue的時候發現有一條message。調用handler消息處理者,執行handlemessage方法,去處理這個message,就可以在handlemessage的方法裡面更新ui。好像畫面感不是太強,舉個例子吧。試想有一個生產方便麵的車間,這個車間有兩條生產線,一條是生產面餅的,一條是生產調料包的,面餅的生產線比較先進一點,配備了一個工人叫handler,還配備了一個調料包分類循環器。這個車間能生產很多種方便麵,有老壇酸菜,有泡椒鳳爪,有香菇燉雞,有紅燒牛肉等等。其中方便麵的面餅都是一樣的,只有調料包和包裝袋不一樣,包裝袋是根據調料包來定的。那麼生產線運作起來了:工人Handler把子生產線(子線程)上的調料包(message)放到了主生產線(主線程)上的調料包分類循環器(Looper)上,通過輪詢分類篩選後工人Handler確定這是一包合格的老壇酸菜味調料包,於是工人把老壇酸菜調料包和面餅放在一塊(sendmessage),告訴主生產線,這是一包老壇酸菜方便麵,請給這包方便麵包一個老壇酸菜的包裝袋(更新UI).

Ⅲ android開發中關於handler部分的困惑

這么說吧,handler是一個消息隊列,其中就有這個Message 當你new了一個handler的時候同時就攜帶了一個Message對象!當你需要傳遞信息的時候直接拿就ok了。同時建議你看一下啊Handler 的機制原理
(給你列舉一下算了):
andriod提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。
1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程里的Message Queue(消息隊列)。
2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到Message Queue里;或者接收Looper從Message Queue取出)所送來的消息。
3) Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UI thread 通常就是main thread,而Android啟動程序時會替它建立一個Message Queue。

Ⅳ android中我們為什麼要用handler

主線程與子線程通信

Ⅳ android handler機制怎麼實現自動調用函數

一、Handler的定義:
主要接受子線程發送的數據, 並用此數據配合主線程更新UI。
解釋:當應用程序啟動時,Android首先會開啟一個主線程 (也就是UI線程) , 主線程為管理界面中的UI控制項, 進行事件分發, 比如說, 你要是點擊一個 Button ,Android會分發事件到Button上,來響應你的操作。 如果此時需要一個耗時的操作,例如: 聯網讀取數據, 或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現假死現象, 如果5秒鍾還沒有完成的話,會收到Android系統的一個錯誤提示 "強制關閉"。 這個時候我們需要把這些耗時的操作,放在一個子線程中

Ⅵ Android 為什麼使用Handler

在Android的UI開發中,我們經常會使用Handler來控制主UI程序的界面變化。有關Handler的作用,我們總結為:與其他線程協同工作,接收其他線程的消息並通過接收到的消息更新主UI線程的內容。
我們假設在一個UI界面上面,有一個按鈕,當點擊這個按鈕的時候,會進行網路連接,並把網路上的一個字元串拿下來顯示到界面上的一個 TextView上面,這時就出現了一個問題,如果這個網路連接的延遲過大,可能是10秒鍾甚至更長,那我們的界面將處於一直假死狀態,而如果這段時間超 過5秒鍾的話,程序會出現異常。
這時我們會想到使用線程來完成以上工作,即當按鈕被按下的時候新開啟一個線程來完成網路連接工作,並把得到的結果更新到UI上面。但是,這時候又會 出現另一個問題,在Android中,主線程是非線程安全的,也就是說UI的更新只能在本線程中完成,其他線程無法直接對主線程進行操作。
為了解決以上問題,Android設計了Handler機制,由Handler來負責與子線程進行通訊,從而讓子線程與主線程之間建立起協作的橋梁,使Android的UI更新的問題得到完美的解決。接下來舉例來詮釋Handler的基本使用方法。
Handler的工作原理
一般情況下,在主線程中我們綁定了Handler,並在事件觸發上面創建新的線程用於完成某些耗時的操作,當子線程中的工作完成之後,會對Handler發送一個完成的信號,而Handler接收到信號後,就進行主UI界面的更新操作。
2
Handler與子線程協作實例
1、創建Handler實現類,在主UI所在類中的內部類
class MyHandler extends Handler {
public MyHandler() { }
public MyHandler(Looper L) {
super(L);
}
// 重寫handleMessage方法,接受數據並更新UI
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//此處根據msg內容進行UI操作
}
}

2、子線程的實現
class MyThread implements Runnable {
public void run() {
Message msg = new Message();
Bundle b = new Bundle();
b.putString("cmd", "update");
msg.setData(b);
MainActivity.this.myHandler.sendMessage(msg);
//通知Handler更新UI
}
}

通過以上的兩個實現,我們只需要在MainActivity中聲明MyHandler實例對象就可以完成線程之間的通訊和界面的更新操作。

MyHandler myHandler = newMyHandler();

Ⅶ 能講講Android的Handler機制嗎

Android的Handler機制是通俗講為了互相發消息,一般是子線程給主線程發消息完成相應操作。

安卓中最常見的操作是子線程操作完事後得到數據想更新UI,安卓有規定不允許在子線程中刷新UI,所以Handler出現了。

使用和理解大致步驟。

  1. 創建全局Handler對象handler,然後在主線程中初始化它(一般在oncreate中),把它的handmessage裡面的方法重寫,這個方法是收到子線程發給它的消息後執行的邏輯。

  2. 在子線程中獲取數據,調用handler.sendmessage,把要發的消息放在message中。message會添加到Messagequue(消息隊列中,handler創建就帶的)。

3.對象handler被創建和初始化的時候,系統自動會啟動Handler.looper,也就是一個消息輪詢器,它不斷的去查看有沒有消息進入到Messagequue(消息隊列中),有就取出交給handler的handmessage去處理。//這段邏輯是系統自動執行,理解就行。*純手打,不騙人~~~

Ⅷ android線程及handler的關系

handler是android特有的機制,最大的好處就是實現了Activity主線程(就是UI主線程)和其他線程(自己定義的Thread)之間的數據通信。Timer和Thread是實現多線程的,而handler是實現線程間通信的,二者很大不同,關於handler的用法

Ⅸ android中 private Handler mHandler = new Handler()是什麼意識,含義是什麼,謝謝啦

handler是android中為了處理非同步線程更新UI的問題而出現的一個工具。

在android非同步線程是不能夠更新UI的,只能在主線程中更新UI。


  1. 這里的mhandler不會被你自己調用。你所要做的就是向handler中傳遞消息,然後handler響應你所傳遞來的消息。

  2. handler會有一個消息隊列,是根據你出入的消息順序排列的,handler會依次響應消息隊列裡面的消息。


總之一句話,就是,當你想要在非同步線程裡面更新UI的時候就使用handler就好了。

Ⅹ Android中Handler的主要作用是什麼通俗點,初學。

Handler的使用主要是android中無法在主線程(即UI線程)中訪問網路、無法在子線程中訪問UI線程元素。
一般是在子線程中訪問網路,然後使用Handler發送message通知主線程處理UI更新操作

閱讀全文

與androidhandler原理相關的資料

熱點內容
如何修改ie代理伺服器 瀏覽:417
折紙手工解壓玩具不用a4紙 瀏覽:485
怎麼雙向傳輸伺服器 瀏覽:286
電腦如何實現跨網段訪問伺服器 瀏覽:549
模塊化網頁源碼位元組跳動 瀏覽:485
梯度下降演算法中遇到的問題 瀏覽:605
伺服器連接電視怎麼接 瀏覽:323
phploop語句 瀏覽:502
交叉編譯工具鏈里的庫在哪 瀏覽:781
安卓手q換號怎麼改綁 瀏覽:399
nba球星加密貨幣 瀏覽:789
命令看網速 瀏覽:124
java堆分配 瀏覽:161
linuxbuiltin 瀏覽:560
cstpdf 瀏覽:941
texstudio編譯在哪 瀏覽:352
國家反詐中心app注冊登記表怎麼注冊 瀏覽:972
加密機默認埠 瀏覽:101
有哪個網站有免費的python源代碼 瀏覽:305
蘋果手機如何導入安卓電話 瀏覽:915