很多初入Android或Java開(kāi)發(fā)的新手對Thread、Looper、Handler和Message仍然比較迷惑,衍生的有HandlerThread、java.util.concurrent、Task、AsyncTask由于目前市面上的書(shū)籍等資料都沒(méi)有談到這些問(wèn)題,今天就這一問(wèn)題做更系統性的總結。我們創(chuàng )建的Service、Activity以及Broadcast均是一個(gè)主線(xiàn)程處理,這里我們可以理解為UI線(xiàn)程。但是在操作一些耗時(shí)操作時(shí),比如I/O讀寫(xiě)的大文件讀寫(xiě),數據庫操作以及網(wǎng)絡(luò )下載需要很長(cháng)時(shí)間,為了不阻塞用戶(hù)界面,出現ANR的響應提示窗口,這個(gè)時(shí)候我們可以考慮使用Thread線(xiàn)程來(lái)解決。 對于從事過(guò)J2ME開(kāi)發(fā)的程序員來(lái)說(shuō)Thread比較簡(jiǎn)單,直接匿名創(chuàng )建重寫(xiě)run方法,調用start方法執行即可?;蛘邚腞unnable接口繼承,但對于A(yíng)ndroid平臺來(lái)說(shuō)UI控件都沒(méi)有設計成為線(xiàn)程安全類(lèi)型,所以需要引入一些同步的機制來(lái)使其刷新,這點(diǎn)Google在設計Android時(shí)倒是參考了下Win32的消息處理機制。 1. 對于線(xiàn)程中的刷新一個(gè)View為基類(lèi)的界面,可以使用postInvalidate()方法在線(xiàn)程中來(lái)處理,其中還提供了一些重寫(xiě)方法比如postInvalidate(int left,int top,int right,int bottom) 來(lái)刷新一個(gè)矩形區域,以及延時(shí)執行,比如postInvalidateDelayed(long delayMilliseconds)或postInvalidateDelayed(long delayMilliseconds,int left,int top,int right,int bottom) 方法,其中第一個(gè)參數為毫秒 2. 當然推薦的方法是通過(guò)一個(gè)Handler來(lái)處理這些,可以在一個(gè)線(xiàn)程的run方法中調用handler對象的 postMessage或sendMessage方法來(lái)實(shí)現,Android程序內部維護著(zhù)一個(gè)消息隊列,會(huì )輪訓處理這些,如果你是Win32程序員可以很好理解這些消息處理,不過(guò)相對于A(yíng)ndroid來(lái)說(shuō)沒(méi)有提供 PreTranslateMessage這些干涉內部的方法。 3. Looper又是什么呢? ,其實(shí)Android中每一個(gè)Thread都跟著(zhù)一個(gè)Looper,Looper可以幫助Thread維護一個(gè)消息隊列,但是Looper和Handler沒(méi)有什么關(guān)系,我們從開(kāi)源的代碼可以看到Android還提供了一個(gè)Thread繼承類(lèi)HanderThread可以幫助我們處理,在HandlerThread對象中可以通過(guò)getLooper方法獲取一個(gè)Looper對象控制句柄,我們可以將其這個(gè)Looper對象映射到一個(gè)Handler中去來(lái)實(shí)現一個(gè)線(xiàn)程同步機制,Looper對象的執行需要初始化Looper.prepare方法就是昨天我們看到的問(wèn)題,同時(shí)推出時(shí)還要釋放資源,使用Looper.release方法。 4.Message 在A(yíng)ndroid是什么呢? 對于A(yíng)ndroid中Handler可以傳遞一些內容,通過(guò)Bundle對象可以封裝String、Integer以及Blob二進(jìn)制對象,我們通過(guò)在線(xiàn)程中使用Handler對象的sendEmptyMessage或sendMessage方法來(lái)傳遞一個(gè)Bundle對象到Handler處理器。對于Handler類(lèi)提供了重寫(xiě)方法handleMessage(Message msg)?來(lái)判斷,通過(guò)msg.what來(lái)區分每條信息。將Bundle解包來(lái)實(shí)現Handler類(lèi)更新UI線(xiàn)程中的內容實(shí)現控件的刷新操作。相關(guān)的Handler對象有關(guān)消息發(fā)送sendXXXX相關(guān)方法如下,同時(shí)還有postXXXX相關(guān)方法,這些和Win32中的道理基本一致,一個(gè)為發(fā)送后直接返回,一個(gè)為處理后才返回 . 5. java.util.concurrent對象分析,對于過(guò)去從事Java開(kāi)發(fā)的程序員不會(huì )對Concurrent對象感到陌生吧,他是JDK 1.5以后新增的重要特性作為掌上設備,我們不提倡使用該類(lèi),考慮到Android為我們已經(jīng)設計好的Task機制,這里不做過(guò)多的贅述,相關(guān)原因參考下面的介紹: 6. 在A(yíng)ndroid中還提供了一種有別于線(xiàn)程的處理方式,就是Task以及AsyncTask,從開(kāi)源代碼中可以看到是針對Concurrent的封裝,開(kāi)發(fā)人員可以方便的處理這些異步任務(wù)。 摘錄自:http://www.android123.com.cn/androidkaifa/422.html
發(fā)表評論