標籤:
如何讓安卓程式在有限的記憶體和電池資源下流暢快速有效率的運行,下面給出了10種實踐中的建議:
有效線程
1. 如何使用後台線程以避免前台負載過荷?
預設情況下,應用程式的所有操作都是在前台的主線程(UI線程)上啟動並執行,應用程式響應能力可能會受到影響,會導致當機,死機,甚至系統錯誤。為了提升反應能力,應該將長時間啟動並執行任務(如網路或資料庫操作,複雜的計算)搬離應用程式的主線程,切換到以一個單獨的後台線程方式運行。
完成這一切換任務的最有效方法是在類層級。您可以使用AsyncTask類或IntentService類??來組織後台工作。一旦你實現了一個IntentService,它會在需要的時候啟動,使用新的一個背景工作執行緒處理請求(意圖)。
當使用IntentService,你應該考慮以下限制:
- 這個類沒有把結果送給UI,所以為了顯示結果,需要使用Activity。
- 一次只有一個請求被處理。
- 任何請求處理不能中斷。
2.如何避免應用不響應ANR?
為了避免應用程式長時間無應答ANR,將長任務操作從UI主線程卸載到後台線程運行,你可以通過繼承AsyncTask 和實現 doInBackground() 方式來實現
另外一個方式是建立一個線程或HandlerThread 實作類別,值得注意的是,你還需要規定線程的"後台" 線程許可權,因為這個新線程預設許可權和UI線程是一樣的,同樣會拖慢整個應用運行速度。
3. 如何在分離的線程中初始化查詢?
資料顯示並不是即時的,儘管你使用CursorLoader 對象可以加快提速,這個對象可以在不打擾使用者和Activity互動情況下,查詢在後台進行。
使用這個對象武裝你的應用,在對於每個ContentProvider 查詢操作初始化一個單獨的後台線程,然後只有在查詢完成時將返回給Activity。
4.其他:
- 使用StrictMode 探測UI線程中你要實現操作的潛在可能的長任務操作。
- 使用特殊工具,如Systrace, Traceview來發現你的應用中響應瓶頸。
- 顯示操作進程表徵圖
- 如果初始安裝非常耗時,顯示啟動畫面。
裝置電池的最佳化
主要影響電池耗電時間有:
- 週期性喚醒更新
- 通過3G和EDGE的資料傳遞
- 文本資料解析 沒有JIT的Regex
5. 如何最佳化網路?
- 如果沒有串連,停止你的應用操作,只有3G或Wifi可串連時更新。
- 選擇壓縮資料,比如將文本和位元據打包在一個請求中。
- 使用有效率的解析器,使用流Stream解析而不是樹tree解析器。
- 減少與伺服器的往返時間次數
- 有可能對文本資料使用GZIP,充分利用CPU資源。
6. 如何最佳化前台應用?
- 當設計喚醒鎖時,請儘可能設定最低層級。
- 避免潛在的Bug引起的電池消耗,使用timeout,杜絕死迴圈。
- 啟用android:keepScreenOn.
- 考慮手動讓GC記憶體回收Java對象,如XmlPullParserFactory 和 BitmapFactory,對於正則使用Matcher.reset(newString) , 使用StringBuilder.setLength(0).
- 小心同步操作synchronization ,儘管它在被UI線程驅動時是安全的。
- 在ListView中要多用迴圈利用策略,盡量多重用一個組件
- 儘可能使用網路定位而不是GPS,
- 在onPause中一定要登出GPS更新,使用者自己能在設定中啟用GPS
- 計算浮點需要很多電池,你也許要考慮地理數學等方面的精度,當在使用DisplayMetrics執行DPI tasks with .時,緩衝計算結果。
7.如何最佳化後台啟動並執行應用?
- 因為每個進程需要2M,當前景程式需要記憶體時需要重啟,確保每個服務是短生命週期。
- 盡量使記憶體消耗低
- 設計應用每30分鐘更新,但是只能在裝置喚醒情況下。
- 服務Service睡眠是不好的,應答使用AlarmManager或<receiver>這樣manifest元素,當完成時調用stopSelf() ,當啟動服務時,使用AlarmManager,使用*_WAKEUP要注意,通過setInexactRepeating()進行複位讓安卓能封裝你的應用程式更新,當使用<receiver>時,動態地在manifest中啟用或失效其組件,特別是空操作情況下。
8. 其他:
- 在進行一個完整更新之前,檢查電池和網路狀態,進行批量處理時要等待電池較好的狀態
- 提供使用者電池使用方式的可選項,以決定更新周期和後台行為。
使用最少記憶體實現UI
9. 如何分辨出布局效能問題?
當你使用布局管理器建立頁面時,你可能會引入一些延遲,為了實現平衡 記憶體消耗少的UI,你需要搜查布局中潛在的效能瓶頸,可以使用安卓SDK目錄<sdk>/tools/下的Hierarchy Viewer 工具。
另外一個發現效能巍峨提的工具是Lint,它能掃描應用源碼中層次尋找Bug。
10. 如何解決效能問題?
你可以通過壓扁層次比如通過從LinearLayout 類轉換到使用RelativeLayout類,壓低層次水平。
提升安卓運行效率的建議