標籤:android介面最佳化 android效能最佳化 android最佳化
最佳化將從以下幾個方面談及
- 如何使用 Adapter
- 背景和映像
- 更新要求
- 視圖和布局
- 記憶體配置
adapter: 最簡單的方法, 最慢最不實用, 更新頻率每秒傳輸幀數10左右 利用 convertView 回收視圖, 效率提高 200%,更新頻率每秒傳輸幀數30左右 使用 ViewHolder 模式, 效率提高 250%,更新頻率每秒傳輸幀數40左右背景和映像: 選擇恰當的映像尺寸,視圖背景映像總會填充整個視圖地區: * 映像尺寸不合適會導致自動縮放 * 避免即時縮放 * 最好預先縮放到視圖大小 originalImage = Bitmap.createScaledBitmap( originalImage, // 被縮放映像 view.getWidth(), // 視圖寬度 view.getHeight(), // 視圖高度 true); // 雙線性過濾器 背景和映像 更新頻率,預先縮放每秒傳輸幀數在50左右 ,自動縮放25左右 視窗背景: * 預設情況下, 視窗有一個不透明的背景 * 有時可以不需要。 - 最高層的視圖是不透明的 - 最高層的視圖覆蓋整個視窗 fill_parent * 更新看不見的背景是浪費時間 * 刪除視窗背景 - getWindow().setBackgroundDrawable(null); - <item name="android:windowBackground">@null</item> 視窗背景 更新頻率,有背景的每秒傳輸幀數在42左右 ,沒有背景在50左右 更新要求: * 當螢幕需要更新時, 調用 invalidate() - 簡單方便 - 但會更新整個視圖, 太貴了 * 最好先找到無效地區, 然後調用。更有效執行方法是只更新需要更新的地區 - invalidate(Rect dirty); - invalidate(int left, int top, int right, int bottom); 視窗背景 更新頻率:invalidate傳輸每秒18左右,後兩個在48左右 視圖和布局: * 如果一個視窗包含很多視圖 - 啟動時間長 測量時間長 布局時間長 繪製時間長 * 如果視圖樹深度太深 - StackOverflowException 使用者介面反應速度很慢 * 解決方案 - 使用 TextView 的複合 drawables 減少層次 - 使用 ViewStub 延遲展開視圖 - 使用 <merge> 合并中間視圖 - 使用 RelativeLayout 減少層次 - 使用自訂視圖、使用自訂布局 記憶體配置: * 不要建立 Java 對象,在效能敏感的代碼裡, 盡量避免建立 Java 對象 - 測量: onMeasure() - 布局: onLayout() - 繪圖: dispatchDraw(), onDraw() - 事件處理: dispatchTouchEvent(), onTouchEvent() - Adapter: getView(), bindView() * GC, 記憶體回收:整個程式會暫停,慢 (大約幾百個毫秒 * 管理好對象 * 使用軟引用,記憶體緩衝的最佳選擇 * 使用弱引用,避免記憶體泄露
總結: * 用 ViewHolder 實現 Adapter 的 getView * 為背景選擇正好的映像 * 針對無效區做更新要求 * 視圖和布局,越簡單越好 * 避免在效能敏感路徑上建立對象
android介面最佳化技巧