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