導航:首頁 > 操作系統 > androidhander

androidhander

發布時間:2024-03-25 22:20:25

android的handler機制的原理

Android的handler機制的原理分為非同步通信准備,消息發送,消息循環,消息處理。

1、非同步通信准備

在主線程中創建處理器對象(Looper)、消息隊列對象(Message Queue)和Handler對象。

2、消息入隊

工作線程通過Handler發送消息(Message) 到消息隊列(Message Queue)中。

3、消息循環

消息出隊: Looper循環取出消息隊列(Message Queue) 中的的消息(Message)。

消息分發: Looper將取出的消息 (Message) 發送給創建該消息的處理者(Handler)。

4、消息處理

處理者(Handler) 接收處理器(Looper) 發送過來的消息(Message),根據消息(Message) 進行U操作。

handler的作用

handler是android線程之間的消息機制,主要的作用是將一個任務切換到指定的線程中去執行,(准確的說是切換到構成handler的looper所在的線程中去出處理)android系統中的一個例子就是主線程中的所有操作都是通過主線程中的handler去處理的。

Handler的運行需要底層的 messagequeue和 looper做支撐。



❷ android中Handler的post方法的作用是什麼

在工作線程中執行耗時任務,當任務完成時,會返回UI線程,一般是更新UI。這時有兩種方法可以達到目的。

一種是handler.sendMessage。發一個消息,再根據消息,執行相關任務代碼。

另一種是handler.post(r)。r是要執行的任務代碼。意思就是說r的代碼實際是在UI線程執行的。可以寫更新UI的代碼。

(2)androidhander擴展閱讀

一個APK文件結構為:

1、META-INF (註:Jar文件中常可以看到);

2、res (註:存放資源文件的目錄) ;

3、AndroidManifest.xml (註:程序全局配置文件) ;

4、classes.dex (註:Dalvik位元組碼);

5、resources.arsc (註:編譯後的二進制資源文件)。

Android在運行一個程序時首先需要UnZip,然後類似Symbian那樣直接執行安裝,和Windows Mobile中的PE文件有區別,這樣做對於程序的保密性和可靠性不是很高,通過dexmp命令可以反編譯,但這樣做符合發展規律,微軟的 Windows Gadgets或者說WPF也採用了這種構架方式。

在Android平台中dalvik vm的執行文件被打包為apk格式,最終運行時載入器會解壓然後獲取編譯後androidmanifest.xml文件中的permission分支相關的安全訪問,但仍然存在很多安全限制,如果你將apk文件傳到/system/app文件夾下會發現執行是不受限制的。

參考資料來源:網路-Android



❸ Android Handler那些事兒,消息屏障IdelHandlerANR

Handler 是Android SDK中用來處理非同步消息的核心類,子線程可以通過handler來通知主線程進行ui更新。

備註:本文源碼截圖 基於Android sdk 28

Handler機制 消息發送主要流程如圖

應用程序啟動後,zygote fork一個應用進程後,和普通java程序一樣,程序會首先執行ActivityThread中的main函數。在main函數中,程序首先會創建Looper對象並綁定到主線程中,然後開啟loop循環。(ps:主線程loop循環不能退出)

在prepareMainLooper方法中,最終會創建Looper,MessageQueue對象 以及創建native層MessageQueue對象。

使用Handler.sendMessageXXX或這 postDedayXXX發送消息後,最終會調用到SendMessageAtTime方法中。

然後調用MessageQueue.enqueueMessage將消息存到消息隊列中。

存入消息後,然後通過調用native方法 喚醒主線程進行消息處理。

當應用程序啟動,做完一些必要工作之後,便會開啟Loop循環,除非系統異常,否則該循環不會停止。loop循環中,主要做兩件事,第一,從消息隊列中取消息。第二,進行消息分發處理。

MessageQueue.next() 方法 通過調用 native方法 nativePollOnce(ptr, nextPollTimeoutMillis)實現無消息處理時,進入阻塞的功能。
當nextPollTimeoutMillis 值為0時,該方法會立刻返回;
當nextPollTimeoutMillis 值為-1時,該方法會無限阻塞,直到被喚醒;
當nextPollTimeoutMillis 值大於0時,該方法會將該值設置為超時時間,阻塞到達一定時間後,返回;

在loop循環中 ,通過調用 msg.target.dispatchMessage(msg) 進行消息的分發處理

使用當前線程的MessageQueue.addIdleHandler方法可以在消息隊列中添加一個IdelHandler。

當MessageQueue 阻塞時,即當前線程空閑時,會回調IdleHandler中的方法;

當IdelHandler介面返回false時,表示該IdelHandler只執行一次,

a,延遲執行

例如,當啟動Activity時,需要延時執行一些操作,以免啟動過慢,我們常常使用以下方式延遲執行任務,但是在延遲時間上卻不好控制。

其實,這時候使用IdelHandler 會更優雅

b,批量任務,任務密集,且只關注最終結果

例如,在開發一個IM類型的界面時,通常情況下,每次收到一個IM消息時,都會刷新一次界面,但是當短時間內, 收到多條消息時,就會刷新多次界面,容易造成卡頓,影響性能,此時就可以使用一個工作線程監聽IM消息,在通過添加IdelHandler的方式通知界面刷新,避免短時間內多次刷新界面情況的發生。

在Android的消息機制中,其實有三種消息: 普通消息、非同步消息及消息屏障。

消息屏障 也是一種消息,但是它的target為 null。可以通過MessageQueue中的postSyncBarrier方法發送一個消息屏障(該方法為私有,需要反射調用)。

在消息循環中,如果第一條消息就是屏障消息,就往後遍歷,看看有沒有非同步消息:
如果沒有,則無限休眠,等待被喚醒
如果有,就看離這個消息被觸發時間還有多久,設置一個超時時間,繼續休眠

非同步消息 和普通消息一樣,只不過它被設置setAsynchronous 為true。有了這個標志位,消息機制會對它有些特別的處理,我們稍後說。

所以 消息屏障和非同步消息的作用 很明顯,在設置消息屏障後,非同步消息具有優先處理的權利。

這時候我們回顧將消息添加到消息隊列中時,可以發現,其實並不是每一次添加消息時,都會喚醒線程。
當該消息插入到隊列頭時,會喚醒該線程;
當該消息沒有插入到隊列頭,但隊列頭是屏障,且該消息是隊列中 靠前的一個非同步消息,則會喚醒線程,執行該消息;

調用MessageQueue.removeSyncBarrier 方法可以移除指定的消息屏障

ANR 即 Application Not Response, 是系統進程對應用行為的一種監控,如果應用程序沒有在規定時間內完成任務的話,就會引起ANR。

ANR類型

Service Timeout : 前台服務20s, 後台服務200s

BroadcastQueue Timeout : 前台廣播 10s,後台廣播60s

ContentPrivider Timeout : 10s

InputDispatching Timeout : 5s

比如,在啟動一個服務時, AMS端通過應用進程的Binder對象創建Service, 在scheleCreateService()方法中 會調用到當前service的onCreate()生命周期函數;

bumpServiceExecutingLocked()方法內部實際上會調用到scheleServiceTimeoutLocked()方法,發送一個ActivityManagerService.SERVICE_TIMEOUT_MSG類型消息到AMS工作線程中。

消息的延時時間,如果是前台服務,延時20s, 如果是後台服務,延時200s;

如果Service的創建 工作在 上訴消息的延時時間內完成,則會移除該消息,

否則,在Handler正常收到這個消息後,就會進行服務超時處理,即彈出ANR對話框。

復雜情況下,可能會頻繁調用sendMessage 往消息隊列中,添加消息,導致消息積壓,造成卡頓,

1,重復消息過濾

頻繁發送同類型消息時,有可能隊列中之前的消息還沒有處理,又發了一條相同類型的消息,更新之前的數據,這時候,可以採用移除前一個消息的方法,優化消息隊列。

2,互斥消息取消

在發送消息時,優先將消息隊列中還未處理的信息已經過時的消息 移除,優化隊列

3,隊列優化-復用消息

創建消息時,優先採用之前回收的消息,避免重復創建對象,引起GC

完~
(如果錯誤或不足,望指出, 大家共同進步)

閱讀全文

與androidhander相關的資料

熱點內容
如何評價如故app 瀏覽:147
建立表結構的命令 瀏覽:579
安卓文件為什麼蘋果手機打不開 瀏覽:82
東奧輕4可以在哪個app做題 瀏覽:163
金融科技加密卡 瀏覽:835
程序員那麼開一共有多少集 瀏覽:980
面試程序員被問數學問題怎麼辦 瀏覽:91
背大學英語的app哪個最好 瀏覽:719
哪個app買的衣服好 瀏覽:467
天刀以前玩過的伺服器忘了怎麼辦 瀏覽:211
單片機基礎代碼解讀 瀏覽:233
廣東青少年編程學習 瀏覽:509
買男士香水去哪個app 瀏覽:548
androidsleep函數 瀏覽:151
android內核代碼下載 瀏覽:665
伺服器如何添加墨跡 瀏覽:747
diglinux安裝 瀏覽:279
虛擬機執行命令 瀏覽:445
cctv16奧林匹克頻道加密播出 瀏覽:900
c盤微信文件夾隱私 瀏覽:229