您好,登錄后才能下訂單哦!
我們知道,Android系統(tǒng)為了提高程序的實時響應(yīng)能力,不允許在UI線程中進行耗時的操作,否則會出現(xiàn)ANR異常,因此必須將耗時的任務(wù)放到非UI線程中執(zhí)行。Android/Java提供了很多類來幫助大家完成異步操作,比如:Thread類,Timer類,AsyncTask類,HandlerThread類,以及Executor接口。這些類都分別在什么場合下使用呢?
本文簡單地總結(jié)一下Android開發(fā)中常見的多線程類型和解決方案,并比較和分析了各個方案的區(qū)別,以便更好地理解和應(yīng)用這些API接口。
1. 單項異步任務(wù)
[場景]:下載一個APK文件,拷貝一個大文件。
[方案]:Thread類,AsyncTask類
[比較]:
AsyncTask提供了onProgressUpdate和onPostExecute通知調(diào)用者任務(wù)執(zhí)行的進度和結(jié)果,在函數(shù)內(nèi)可以直接執(zhí)行UI操作。
而Thread中不能直接操作UI界面,而要通過Activity.runOnUiThread或者借助Handler來完成UI的更新。
所以Thread更適合執(zhí)行一些不需要跟UI頻繁交互的單項任務(wù),而AsyncTask相反。
2. 定時/循環(huán)執(zhí)行的任務(wù)
[場景]:定時刷新UI(如:秒表),保持TCP心跳連接。
[方案]:“Thread + sleep”,定時器Timer
[比較]:
“Thread + sleep” 方案示例:
new Thread(new Runnable() { @Override public void run() { while(!EXIT) { Thread.sleep(1000); mListener.onTimeArrived(); } } }).start();
兩者都不能在循環(huán)中執(zhí)行UI更新操作,而必須借助Activity.runOnUiThread或者Handler來完成UI的更新。
由于Thread方案中onTimeArrived()占用了部分時間,所以這種方案的定時并不準確,而Timer是由系統(tǒng)創(chuàng)建異步通知的定時器,會更加準確,所以推薦使用Timer來完成定時任務(wù)。
3. 工作線程
工作線程啟動后處于一種等待“命令”/“消息”的休眠狀態(tài),當接收到“命令”/“消息”后,將它放入“命令”/“消息”隊列,然后喚醒線程依次串行或者并行執(zhí)行。
[場景]:“生產(chǎn)者--消費者”模式,TCP Server端命令處理程序
[方案]: “Thread + condition/lock” ,HandlerThread類,線程池Executor
[比較]:
HandlerThread類是Android系統(tǒng)提供了封裝好了Loop循環(huán)的Thread類,可以更加便捷地完成CallerThread和WorkThread的命令/消息交互。當然,我們也可以用Thread和Condition/Lock方式實現(xiàn)同樣的效果,只不過要自己實現(xiàn)更多的代碼。
前面的兩種方式,都是“串行”的方式在執(zhí)行“命令”,如果希望提供并發(fā)性,同時開啟和管理多個線程來執(zhí)行任務(wù),則可以考慮使用Executor。
以上就是我對Android多線程編程的簡單小結(jié),文中有任何不清楚或者不正確的地方,歡迎留言或者來信lujun.hust@gmail.com交流討論,或者關(guān)注我的新浪微博 @盧_俊 獲取最新的文章和資訊。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。