91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發實踐:多線程編程小結

發布時間:2020-06-10 20:07:02 來源:網絡 閱讀:2627 作者:Jhuster 欄目:移動開發

我們知道,Android系統為了提高程序的實時響應能力,不允許在UI線程中進行耗時的操作,否則會出現ANR異常,因此必須將耗時的任務放到非UI線程中執行。Android/Java提供了很多類來幫助大家完成異步操作,比如:Thread類,Timer類,AsyncTask類,HandlerThread類,以及Executor接口。這些類都分別在什么場合下使用呢?


本文簡單地總結一下Android開發中常見的多線程類型和解決方案,并比較和分析了各個方案的區別,以便更好地理解和應用這些API接口。


1. 單項異步任務


[場景]:下載一個APK文件,拷貝一個大文件。


[方案]:Thread類,AsyncTask類


[比較]:


AsyncTask提供了onProgressUpdate和onPostExecute通知調用者任務執行的進度和結果,在函數內可以直接執行UI操作。


而Thread中不能直接操作UI界面,而要通過Activity.runOnUiThread或者借助Handler來完成UI的更新。


所以Thread更適合執行一些不需要跟UI頻繁交互的單項任務,而AsyncTask相反。



2. 定時/循環執行的任務


[場景]:定時刷新UI(如:秒表),保持TCP心跳連接。


[方案]:“Thread + sleep”,定時器Timer


[比較]:


“Thread + sleep” 方案示例:


new Thread(new Runnable() {			
    @Override
    public void run() {				
	while(!EXIT) {
	    Thread.sleep(1000);
            mListener.onTimeArrived();
	}				
    }
}).start();


兩者都不能在循環中執行UI更新操作,而必須借助Activity.runOnUiThread或者Handler來完成UI的更新。


由于Thread方案中onTimeArrived()占用了部分時間,所以這種方案的定時并不準確,而Timer是由系統創建異步通知的定時器,會更加準確,所以推薦使用Timer來完成定時任務。


3. 工作線程


工作線程啟動后處于一種等待“命令”/“消息”的休眠狀態,當接收到“命令”/“消息”后,將它放入“命令”/“消息”隊列,然后喚醒線程依次串行或者并行執行。


[場景]:“生產者--消費者”模式,TCP Server端命令處理程序


[方案]: “Thread + condition/lock” ,HandlerThread類,線程池Executor


[比較]:


HandlerThread類是Android系統提供了封裝好了Loop循環的Thread類,可以更加便捷地完成CallerThread和WorkThread的命令/消息交互。當然,我們也可以用Thread和Condition/Lock方式實現同樣的效果,只不過要自己實現更多的代碼。


前面的兩種方式,都是“串行”的方式在執行“命令”,如果希望提供并發性,同時開啟和管理多個線程來執行任務,則可以考慮使用Executor


以上就是我對Android多線程編程的簡單小結,文中有任何不清楚或者不正確的地方,歡迎留言或者來信lujun.hust@gmail.com交流討論,或者關注我的新浪微博 @盧_俊 獲取最新的文章和資訊。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大余县| 桦川县| 丹东市| 贵德县| 尖扎县| 咸宁市| 屏南县| 珠海市| 教育| 怀化市| 正镶白旗| 蓝山县| 赤峰市| 平远县| 赫章县| 临沧市| 泾阳县| 绥德县| 渝北区| 万源市| 岚皋县| 岳阳市| 宁国市| 德惠市| 宝坻区| 大关县| 高安市| 曲阳县| 扎囊县| 太湖县| 乌鲁木齐县| 陆川县| 林甸县| 垣曲县| 渝中区| 德保县| 文水县| 邵阳市| 怀安县| 绥芬河市| 南漳县|