Android培訓之核心UI線程—離開返回的無縫銜接?
2016-03-02 13:30:43
1179瀏覽
作為Android開發(fā)者,我們都知道保持uI響應靈敏的重要性.因此開發(fā)者把類似I/0操作這樣的耗時任務放在后臺線程中執(zhí)行:當后臺線程執(zhí)行完畢后,經(jīng)常需要更新UI:Android可能與讀者熟知的其他uI系統(tǒng)非常相似,并不是線程安全的:在修改任何ImageView之前,必須返回到應用程序主線程中,試圖在主線程之外修改uI會導致異常。
Android培訓之核心UI線程—離開返回的無縫銜接
初始實現(xiàn)代碼使用的是AsyncTask的onPostExecute()方法:因為我們使用Executor代替AsyncTask,因此需要為宿主Activity準備一個Runnable對象:我們會用到Activity的runonu汀hread()方法,該方法會使用Handler在后臺將我們的工作添加到u1的消息隊列中:
切換到uI線程是需要考慮的二讀者必須注意下述幾個方面:
口如果用戶滾動ListView,ImageView的實例有可能被回收
口宿主Activity有可能在任務完成前已經(jīng)被銷毀
因此,用于處理圖片的Runnable的每一步都需要檢查是否應該停止處理圖片二如果宿主Activity使用ImageWorker的setExit,TasksEarly(1方法設置一個標記(flag),就可以檢查到停止狀態(tài).該方法需要在onPause()方法中調用。此外,如果FutureTask的cancel()方法被調用,也可以檢查到停止狀態(tài)。
注意事項
對于產(chǎn)品級應用程序,Android官方文檔的training小節(jié)建議使用更好的磁盤緩存解決方案。原始文檔提供的實現(xiàn)方案缺少幾個關鍵部分,為此,這里提供一個更完整的例子,修改磁盤緩存的實現(xiàn)代碼,使其支持在應用程序重啟時可以重建磁盤緩存,并且不再需要維護這部分代碼的兩份拷貝。
加載圖片等耗時T作需要在uI線程之外執(zhí)行.這會使類似ListView這樣的內置組件平滑運行。讀者可以使用一個LIFO隊列對加載圖片的順序進行微調,以此獲得更好的用戶體驗。
使用一個可能會生成無數(shù)實例的AsyncTask會導致潛在問題。使用executor可以更好地完成AsyncTask的工作。此外,
Android開發(fā)在支持庫中提供了一個穩(wěn)定的LruCache實現(xiàn),用于提供高效緩存解決方案。
查看更多關于“Android培訓資訊”的相關文章>>
標簽: