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

如何在Android中用好多線程

來源:網絡

點擊:1094

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線程類似的消息處理機制,需要其他線程可以跟你的線程通訊,可以通過這種方法實現。

    (審核編輯: 智匯小新)

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

    主站蜘蛛池模板: 拉力试验机|电子万能试验机|液压万能试验机|摩擦磨损试验机|济南试验机厂家-济南思达测试技术有限公司 | 中国环博会 | 亚洲旗舰环保展 2025.4.21-23 上海新国际博览中心 中国焊接协会网站—中国焊接信息网;焊接行业最权威访问量最大的专业网站:焊接信息、焊接材料,焊接机器,焊接设备,焊机,焊材,辅助设备,焊机配件,仪器仪表,电动工具,钎焊,送丝机,表面处理,自动化专机,焊锡丝,助焊剂 | 威海赶海网、乳山特产、威海专营海产品、威海旅游产品 - 威海赶海电子商务 | 粮食烘干机|玉米烘干机|稻谷烘干机|小麦烘干机|大型连续烘干塔|500吨连续烘干塔|钢板仓|-郑州新光矿山机械制造有限公司 | 园林绿化平台|园林绿化网|苗木网|苗圃网||苗木报价网|园林招标网|园林苗木网|园林工程网|景观设计网|园林机械网|绿化苗木网| | 连云港物流,连云港物流公司就选连云港华美物流有限公司 | 外圆/圆管抛光机_方管抛光机/除锈机_活塞杆抛光机-不锈钢管抛光机-邢台欧邦机械 | 小耳朵电源_安防监控电源|小耳朵官网|电源适配器|摄像机电源|开关电源|小耳朵监控电源 | 无锡防爆墙-无锡泄爆墙_江苏鑫立轩装饰工程有限公司 | 仪器校准-计量检测-计量校准-中健计量检测(广东)有限公司 | 耐磨焊丝厂-堆焊焊材研发-修复工程-天津舜荣焊材官网 | 卧式镗铣床,道斯镗铣机床加工中心-江苏道斯数控科技有限公司 | 昆明纸箱厂-礼盒定制-包装盒定做-纸箱厂-云南包掌柜包装有限公司 | 山东正奇塑料机械有限公司,山东塑料机械,水带机组,塑料管材机,山东吹膜机组厂家,山东农膜机厂家 山东长青石油液压机械有限公司-致力于石油机械设备的研发制造,提供定制服务 | 浙江日新电气有限公司| 上海垃圾房,简易成品环保垃圾房,小区室外垃圾房,上海翼亭智能垃圾房厂家 | 一体化净水器设备-浸没式膜水处理设备-智慧水务-超滤膜-模块化净水设备-浙江华晨环保有限公司 | 浙江创洁卫生消杀有限公司-浙江杀虫公司,温州消杀公司,温州灭鼠公司,灭蟑螂,灭蚊蝇,灭跳蚤,灭书虱,灭臭虫,灭螨虫,白蚁防治,房间消毒除味等专业服务 | 秦皇岛市华谊彩印有限公司 | 商易网-b2b电子商务平台网站大全免费B2B发布供求信息网站 | 联动机-钻井转盘-滑动游车-河南思达瑞石油机械制造有限公司 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 久久91精品久久91综合_国产亚洲自拍一区_国产精品第1页_亚洲高清视频一区_91成人午夜在线精品_亚洲国产精品网站在线播放_亚洲国产成人久久综合区_国产精品亚洲专区在线观看_免费视频精品一区二区三区 | 少妇厨房与子伦_污污内射久久一区二区欧美日韩_四房婷婷 | 长沙联合产权交易所有限公司| 乌鲁木齐万疆通管道设备有限公司 销售热线;13565955557-新疆 乌鲁木齐 万疆通 管道设备 波纹补偿器 膨胀节 金属软管 伸缩器 管件 阀门 维修 | 造型松|造型黑松|油松|泰山松-莱芜市盛世园林苗木专业合作社 | 全网营销_网络推广外包_全网营销代运营公司-湖南微望互动 | 一站式应用与数据集成平台(iPaaS) - 数环通 | 金刚石线切割-电火花穿孔机-中走丝线切割-泰州锐特 | 昆山开曼流体系统科技有限公司 | 洗车机-自动汽车洗车机-全自动洗车设备-全自动电脑洗车机-北京自然绿环境科技发展有限公司 | 文轩热能_水冷板散热器热设计热管理系统_铝型材铲齿摩擦焊热管_散热片散热板生产加工厂家 | 桥梁伸缩缝_桥梁伸缩缝厂家_桥梁伸缩缝价格-衡水淞皓路桥养护工程有限公司 | 云南万通汽车学校【官方网站】 | 烟台废旧物资回收,烟台废品回收,烟台物资回收-烟台金泰再生资源有限公司 | 妙手官网—商品管理、批量修改、订单处理、营销水印 | 无线计量仪表-电力物联网仪表-CE认证电表 | 自动隔油提升设备,消防稳压一体设备,苏州不锈钢消防水箱,污水提升设备厂家,无负压变频供水设备厂家-苏州脉泉供水设备有限公司 | 上海鳞片胶泥-环氧胶泥价格-鳞片涂料批发-乙烯基树脂-环氧结构胶-上海富晨 | 天下机械|机床商讯-机械网|机械技术|机械信息|机床资讯|机床设备|机床商讯杂志 |