線程間通信是在Android開發(fā)中比較經(jīng)常遇到的,我們刷新UI界面一般是通過子線程做完某些事情后,要改變主頁面就要通過數(shù)據(jù)的通信,讓主線程接收到信息后自己改變UI界面。
創(chuàng)新互聯(lián)專業(yè)提供成都主機托管四川主機托管成都服務(wù)器托管四川服務(wù)器托管,支持按月付款!我們的承諾:貴族品質(zhì)、平民價格,機房位于中國電信/網(wǎng)通/移動機房,西云機房服務(wù)有保障!
Android的handler機制的原理分為異步通信準(zhǔn)備,消息發(fā)送,消息循環(huán),消息處理。異步通信準(zhǔn)備 在主線程中創(chuàng)建處理器對象(Looper)、 消息隊列對象(Message Queue)和Handler對象。
Handler是Android消息機制的上層接口。通過它可以輕松地將一個任務(wù)切換到Handler所在的線程中去執(zhí)行。通常情況下,Handler的使用場景就是 更新UI 。在子線程中,進(jìn)行耗時操作,執(zhí)行完操作后,發(fā)送消息,通知主線程更新UI。
Handler就是解決線程與線程間的通信。 當(dāng)我們在子線程處理耗時操作,耗時操作完成后我們需要更新UI的時候,這就是需要使用Handler來處理了,因為子線程不能更 新UI,Handler能讓我們?nèi)菀椎陌讶蝿?wù)切換回來它所在的線程。
Handler對象在進(jìn)行初始化的時候,會默認(rèn)的自動綁定消息隊列。利用類post方法,可以將Runnable對象發(fā)送到消息隊列中,按照隊列的機制按順序執(zhí)行不同的Runnable對象中的run方法。
問題:在Android啟動后會在新進(jìn)程里創(chuàng)建一個主線程,也叫UI線程( 非線程安全 )這個線程主要負(fù)責(zé)監(jiān)聽屏幕點擊事件與界面繪制。當(dāng)Application需要進(jìn)行耗時操作如網(wǎng)絡(luò)請求等,如直接在主線程進(jìn)行容易發(fā)生ANR錯誤。
1、線程池的概率來自于java的Executor接口,實現(xiàn)類是ThreadPoolExecutor, 它提供一系列的參數(shù)來配置線程池,以此構(gòu)建不同的線程池。Android的線程池分4類,都是通過Executors所提供的工廠方法來得到。
2、在Android中線程池就是ThreadPoolExecutor對象。我們先來看一下ThreadPoolExecutor的構(gòu)造函數(shù)。
3、線程池 ThreadPoolExecutor 創(chuàng)建,將任務(wù)派發(fā)給線程池,execute() 方法,自動分配線程執(zhí)行。
4、ThreadPoolExecutor 是線程池的核心實現(xiàn)類,用來執(zhí)行被提交的任務(wù) corePoolSize 核心線程數(shù) maximumPoolSize 最大線程數(shù) 線程池中允許的最大線程數(shù)。
5、可以看出 newFixedThreadPool() 是通過創(chuàng)建 ThreadPoolExecutor 來創(chuàng)建線程池的。并且因為 corePoolSize 和 maximumPoolSize 是一樣的,所以這種線程池只有核心線程,任務(wù)超出線程數(shù)后,會在隊列中等待。
6、想想一個場景: 線程池:只有一個核心線程。
1、因為你沒有開多線程,也沒用異步,UI主線程和你加載數(shù)據(jù)的是一個線程,所以要等數(shù)據(jù)加載完才可以,執(zhí)行你的接下來的操作。
2、調(diào)用publicProgress(Progress…)來更新任務(wù)的進(jìn)度。onPostExecute(Result) 相當(dāng)于Handler 處理UI的方式,在這里面可以使用在doInBackground 得到的結(jié)果處理操作UI。
3、)方法后跳出界面。而點擊menu鍵時,系統(tǒng)默認(rèn)不進(jìn)行任何處理。這里只是一個簡單的應(yīng)用demo,我們可以根據(jù)自己的需要設(shè)計一個更完美的退出程序?qū)υ捒?。也可以在監(jiān)聽到返回事件后進(jìn)行其他處理,等等。
4、可以彈出提示框、執(zhí)行線程獲取數(shù)據(jù);數(shù)據(jù)獲取完成發(fā)送通知給handler;通過handler接收通知,取消等待框并執(zhí)行下面的語句。
5、第一步:自定義一個WaitingDialog,該Dialog支持自定義文本,一個可轉(zhuǎn)動的圖片,也可以增加一個定時關(guān)閉的接口,當(dāng)然也可以選擇外部定時關(guān)閉。第二步:在頁面調(diào)用。
線程池的實現(xiàn) ThreadPoolExecutor是線程池的真正實現(xiàn)??匆幌滤闹饕獏?shù):ThreadPoolExecutor執(zhí)行時大致遵循如下規(guī)則: 線程池的分類 Java默認(rèn)實現(xiàn)了4種線程池,它們都是通過配置ThreadPoolExecutor實現(xiàn)的。
AsyncTask: 為 UI 線程與工作線程之間進(jìn)行快速的切換提供一種簡單便捷的機制。適用于當(dāng)下立即需要啟動,但是異步執(zhí)行的生命周期短暫的使用場景。
每個Thread對象描述了一個單獨的線程。要產(chǎn)生一個線程,有兩種方法:◆需要從Java.lang.Thread類派生一個新的線程類,重載它的run()方法;◆實現(xiàn)Runnalbe接口,重載Runnalbe接口中的run()方法。
傳統(tǒng)的多線程是通過繼承Thread類及實現(xiàn)Runnable接口來實現(xiàn)的,每次創(chuàng)建及銷毀線程都會消耗資源、響應(yīng)速度慢,且線程缺乏統(tǒng)一管理,容易出現(xiàn)阻塞的情況,針對以上缺點,線程池就出現(xiàn)了。
HandlerThread 創(chuàng)建一個帶有消息循環(huán)的線程。遠(yuǎn)程調(diào)用Remote procedure callsAndroid有一個遠(yuǎn)程調(diào)用(RPCs) 的輕量級機制— 通過這個機制,方法可以在本地調(diào)用,在遠(yuǎn)程執(zhí)行(在其他進(jìn)程執(zhí)行),還可以返回一個值。
子線程則主要是處理耗時任務(wù),也是我們要重點分析的。
當(dāng)前名稱:android使用線程 安卓線程池的使用
分享路徑:http://jinyejixie.com/article28/dgjogjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站策劃、做網(wǎng)站、網(wǎng)站排名、App設(shè)計、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)