智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

如何在Android中用好多線程

來源:網絡

點擊:1101

A+ A-

所屬頻道:新聞中心

關鍵詞: Android,多線程,多任務,ANR

      首先我們思考幾個問題,在Android應用中為什么要用多線程?為了解決哪些問題?或者為了實現哪些功能?有哪些好處?請先思考一分鐘,再繼續往下看。

      學習而不思考就像吃東西而不嚼,要么無法下咽,要么嘗不出味道,同時都會影響消化吸收。控制一下你那脫韁野馬一樣的好奇心吧,先思考再往下看。

     

      1. 為什么要用多線程

     

      這里列出幾個原因:

      a) 提高用戶體驗或者避免ANR

      在事件處理代碼中需要使用多線程,否則會出現ANR(Application is not responding),或者因為響應較慢導致用戶體驗很差。

     

    如何在Android中用好多線程  

      圖1 ANR對話框

     

      b) 異步

      應用中有些情況下并不一定需要同步阻塞去等待返回結果,可以通過多線程來實現異步,例如:上一點中提到的,你的應用中的某個Activity需要從云端獲取一些圖片,加載圖片比較耗時,這時需要使用異步加載,加載完成一個圖片刷新一個,見下面圖2、圖3 。

      c) 多任務

      例如多線程下載。

      后兩點與Java中的多線程應用沒有太大區別,不細說。

      下面重點說明第一點,即如何減少事件響應的時間從而提高用戶體驗,以及如何避免ANR。

     

      2. 為什么通過多線程可以提高用戶體驗、避免ANR

     

      大家還記得我在群里說過的移動開發的“三不要”原則嗎?即:不要讓我想、不要讓我等、不要讓我煩。響應慢了用戶需要等,等的次數多了就會煩,你的應用離被卸載不遠了。

      首先我們來了解一下Android應用程序的main線程,它負責處理UI的繪制,Android系統為了防止應用程序反應較慢導致系統無法正常運行做了一個處理,一種情況是當用戶輸入事件在5秒內無法得到響應,那么系統會彈出ANR對話框,由用戶決定繼續等待還是強制結束應用程序(另一種情況是BroadcastReciever 超過10秒沒執行完也會彈出ANR對話框)。

      即使你的程序中某個事件響應不超過5秒鐘,人眼可以分辨的時間是0.1秒,小于0.1秒基本感覺不出來,超過0.2秒用戶就能感覺到有點兒卡了,俗稱打嗝現象,2秒以上就很慢了,用戶體驗會很差。有同學說我可以用進度條啊,但你的程序中不能到處都是進度條,否則那個圈圈會把用戶轉暈的,好像在對用戶說,畫個圈圈煩死你……

      比如某些應用,它要顯示很多圖片,還好它是異步的,不過在圖片加載完成前每個圖片的位置上都有一個圈圈,讓人看了很煩。你可以變通一下,圖片加載成功之前顯示一個默認的圖片,加載成功后再刷新一下即可,何必弄那么多進度條呢?

     

      

      圖2 加載圖片完成前顯示默認圖片,加載完成后再刷新

      

      圖3 加載圖片完成前顯示默認圖片,加載完成后再刷新

      

      圖4 轉暈你,煩死你

     

      事件處理的原則:所有可能耗時的操作都放到其他線程去處理。

      Android中的Main線程的事件處理不能太耗時,否則后續的事件無法在5秒內得到響應,就會彈出ANR對話框。那么哪些方法會在 Main線程執行呢?

      1) Activity的生命周期方法,例如:onCreate()、onStart()、onResume()等

      2) 事件處理方法,例如onClick()、onItemClick()等

      通常Android基類中以on開頭的方法是在Main線程被回調的。

      提高應用的響應性,可以從這兩方面入手。

      一般來說,Activity的onCreate()、onStart()、onResume()方法的執行時間決定了你的應用首頁打開的時間,這里要盡量把不必要的操作放到其他線程去處理,如果仍然很耗時,可以使用SplashScreen。使用SplashScreen最好用動態的,這樣用戶知道你的應用沒有死掉。

     

      

      圖5 動態SplashScreen 

      當用戶與你的應用交互時,事件處理方法的執行快慢決定了應用的響應性是否良好,這里分兩種情況:

      1) 同步,需要等待返回結果。例如用戶點擊了注冊按鈕,需要等待服務端返回結果,那么需要有一個進度條來提示用戶你的程序正在運行沒有死掉。一般與服務端交互的都要有進度條,例如系統自帶的瀏覽器,URL跳轉時會有進度條。

      2) 異步,不需要等待返回結果。例如微博中的收藏功能,點擊完收藏按鈕后是否成功執行完成后告訴我就行了,我不想等它,這里最好實現為異步的。

      無論同步異步,事件處理都可能比較耗時,那么需要放到其他線程中處理,等處理完成后,再通知界面刷新。

      這里有一點要注意,不是所有的界面刷新行為都需要放到Main線程處理,例如TextView的setText()方法需要在Main線程中,否則會拋出CalledFromWrongThreadException,而ProgressBar的setProgress()方法則不需要在Main線程中處理。

      當然你也可以把所有UI組件相關行為都放到Main線程中處理,沒有問題。可以減輕你的思考負擔,但你最好了解他們之間的差別,掌握事物之間細微差別的是專家。把事件處理代碼放到其他線程中處理,如果處理的結果需要刷新界面,那么需要線程間通訊的方法來實現在其他線程中發消息給Main線程處理。

     

      3. 如何實現線程間通訊

     

      在Android中有多種方法可以實現其他線程與Main線程通訊,我們這里介紹常見的兩種。

      1) 使用AsyncTask

      AsyncTask是Android框架提供的異步處理的輔助類,它可以實現耗時操作在其他線程執行,而處理結果在Main線程執行,對于開發者而言,它屏蔽掉了多線程和后面要講的Handler的概念。你不了解怎么處理線程間通訊也沒有關系,AsyncTask體貼的幫你做好了。不過封裝越好越高級的API,對初級程序員反而越不利,就是你不了解它的原理。當你需要面對更加復雜的情況,而高級API無法完成得很好時,你就杯具了。所以,我們也要掌握功能更強大,更自由的與Main線程通訊的方法:Handler的使用。

      AsyncTask的使用方法見示例工程《EX10_02AsyncTask》

      2) 使用Handler

      這里需要了解Android SDK提供的幾個線程間通訊的類。

      2.1 Handler

      Handler在android里負責發送和處理消息,通過它可以實現其他線程與Main線程之間的消息通訊。

      2.2 Looper

      Looper負責管理線程的消息隊列和消息循環

      2.3 Message

      Message是線程間通訊的消息載體。兩個碼頭之間運輸貨物,Message充當集裝箱的功能,里面可以存放任何你想要傳遞的消息。

      2.4 MessageQueue

      MessageQueue是消息隊列,先進先出,它的作用是保存有待線程處理的消息。

      它們四者之間的關系是,在其他線程中調用Handler.sendMsg()方法(參數是Message對象),將需要Main線程處理的事件添加到Main線程的MessageQueue中,Main線程通過MainLooper從消息隊列中取出Handler發過來的這個消息時,會回調Handler的handlerMessage()方法。

      除了以上兩種常用方法之外,還有幾種比較簡單的方法

      3) Activity.runOnUiThread(Runnable)

      4) View.post(Runnable)

      View.postDelayed(Runnable, long)

      5) Handler.post

      Handler.postDelayed(Runnable, long)

     

      4. 利用線程池提高性能

     

      這里我們建議使用線程池來管理臨時的Thread對象,從而達到提高應用程序性能的目的。

      線程池是資源池在線程應用中的一個實例。了解線程池之前我們首先要了解一下資源池的概念。在JAVA中,創建和銷毀對象是比較消耗資源的。我們如果在應用中需要頻繁創建銷毀某個類型的對象實例,這樣會產生很多臨時對象,當失去引用的臨時對象較多時,虛擬機會進行垃圾回收(GC),CPU在進行GC時會導致應用程序的運行得不到相應,從而導致應用的響應性降低。

      資源池就是用來解決這個問題,當你需要使用對象時,從資源池來獲取,資源池負責維護對象的生命周期。

      了解了資源池,就很好理解線程池了,線程池就是存放對象類型都是線程的資源池。

      我增加了如何在其他線程中創建Handler的例子作為選學,前面都掌握好了的同學可以看一下,如果你需要實現一個跟Main線程類似的消息處理機制,需要其他線程可以跟你的線程通訊,可以通過這種方法實現。

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內容及圖片均來自網絡及各大主流媒體。版權歸原作者所有。如認為內容侵權,請聯系我們刪除。

    主站蜘蛛池模板: 深圳货柜租赁_集装箱出售/租赁_集装箱改造_鹏泰集装箱 | 庭院大门,铝艺大门厂家,别墅庭院大门「免费设计」汉兰达庭院门厂家 | 浏阳企业网站建设|设计|制作,专业做网站,建站公司-冠讯网络公司 领先的一站式_专利申请代理知识产权服务平台_乐知网 | 上海三友医疗器械股份有限公司| 意优教育|意大利留学中介_意大利留学费用_意大利申请条件_北京意大利语培训学校 | 潍坊铝单板_铝方通及氟碳喷涂材料供应企业-潍坊冠杰金属制品有限公司 | 拖链电缆-卷筒电缆-行车电缆-机器人电缆-上海甲朗制造 | 芜湖表面处理-涂装-精密加工-阳极氧化-芜湖研历光电科技有限公司 | 山东货架,山东仓库货架,临沂仓库货架,临沂仓储货架-山东兴博物流设备有限公司 | 柯赛德斯-加美润滑油-专业做汽车工业润滑油品牌加盟代理 | 消防烟感清洗,火灾探测器清洗,探测器清洗厂家| 铝压铸件_铝合金压铸件_铝合金压铸件厂家-安平县长虹压铸厂 | 领先的一站式_专利申请代理知识产权服务平台_乐知网 | 腻子粉厂家_耐水腻子粉_内墙腻子粉批发_生态腻子粉_长沙美恩生态腻子粉厂家 | 欣宇航化工-湖北片碱-冰醋酸厂家联系方式-工业氨水价格-工业片碱厂家-武汉宇航化工 | 钕铁硼-强力磁铁-永磁铁「聚盛磁铁」10年定制加工生产厂家 | 山东飞斯特汽车科技有限公司| 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 家用座椅电梯 斜挂升降平台 无障碍升降机 残疾人升降机的生产厂家超易达机械 | 深圳市泰美乐纸制品有限公司-纸杯厂,一次性纸杯,广告纸杯,奶茶纸杯,试饮纸杯定做 | 唐山自粘防水|沥青防水涂料信息|压膜防水卷材报价-德生防水股份有限公司 | 专业网站建设_企业品牌营销 · 北京汇仁智杰科技有限公司 | 实验反应釜,高压反应釜,玻璃反应釜,不锈钢反应釜-烟台招远松岭化工设备有限公司 | 上海礼品公司_定制商务礼品_促销礼品_福利礼品_创意礼品_上海普田商贸有限公司 | 河北省金融租赁有限公司官网| 苏州注塑|无锡注塑|上海注塑|苏州汉科精密注塑有限公司 | 生物除臭箱,玻璃钢拱形盖板_厂家_价格-河北润达环保设备有限公司 | 网带窑,催化剂网带窑,电热回转窑-淄博圣元窑炉工程有限公司 | 湖北高新技术企业认定申报|武汉高企认定代办|武汉项目申报首选 - 湖北创优企科技服务有限公司 | 生物除臭剂-养殖场垃圾除臭剂-垃圾填埋场除臭剂-成都微菌环境 | 温州方圆仪器有限公司 工业自动化|自动化设备 - 温州方圆仪器有限公司 | 陶瓷纤维模块|陶瓷纤维毯|陶瓷纤维纸|高温隔热材料|陶瓷纤维厂家-济南火龙热陶瓷有限责任公司 | 山东汇河环保科技集团有限公司,水囊水袋,水罐,油囊,预压水袋,吊重水袋_山东汇河环保科技集团有限公司,水囊水袋,水罐,油囊,预压水袋,吊重水袋 | 美林基业集团官网——美林基业,一生挚诚 | 山东正奇塑料机械有限公司,山东塑料机械,水带机组,塑料管材机,山东吹膜机组厂家,山东农膜机厂家 山东长青石油液压机械有限公司-致力于石油机械设备的研发制造,提供定制服务 | 实验室冷水机-冷却循环水系统-深圳市达沃西制冷设备厂 | 威海实木家具-威海定制家具-威海家具-威海至佳百隆家具有限公司 威海木箱,威海木托盘,威海免熏蒸包装箱-威海耀晟木制品有限公司 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 精密机械加工_零件加工_机械零部件加工厂_高精密零件加工定制—深圳精密机械加工厂 | 污水处理控制系统设计_plc编程控制柜_电气成套设备生产厂家_合肥鸿昇自动化 | 厦门空压机-厦门空压机出租-厦门钻机出租-厦门岩立盛机电设备有限公司 |