您好,登錄后才能下訂單哦!
如何在Android項目中優化卡頓?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
卡頓原因
過于復雜的布局
界面性能取決于 UI 的渲染性能,UI 渲染的整個過程由 CPU 和 GPU 兩個部分協同完成。CPU 負責 UI 布局元素的 Measure、Layout、Draw 等相關運算執行,GPU負責柵格化(rasterization),將 UI 元素繪制到屏幕上。
如果 UI 布局層次太深,或是自定義控件的 onDraw 中有復雜運算,CPU 的相關運算就可能大于 16ms,導致卡頓。
過度繪制
UI 線程的復雜運算
UI 線程的復雜運算會造成 UI 無響應,導致 ANR,但更多的是造成 UI 響應停滯卡頓,ANR 是卡頓的極致。
頻繁的 GC
優化方法
1、減少刷新次數
比如進度更新,要進度有變化再去刷新,且保證頻率不得高于系統的刷新頻率。
2、避免非必要的刷新
若控件不可見,則無需刷新。
3、避免后臺線程影響
如列表控件,在滑動時不要去加載圖片,可以在滑動監聽里停止圖片的加載。
4、局部刷新
如 RecyclerView 的 DiffUtil。自定義 View 可以使用下面兩個方法:
invalidate(Rect dirty); invalidate(int left, int top, int right, int bottom);
5、盡量使用屬性動畫,它減少了自身的重繪。最后要清除
StringBuilder,List 等在創建時傳入一個合適的參數指定初始容量,以避免頻繁擴容的開銷。
6、開啟硬件加速
7、原理可見 Android硬件加速原理與實現簡介,理解Android硬件加速原理的小白文
Application 級別
<application android:hardwareAccelerated="true" />
Activity 級別
<activity android:hardwareAccelerated="true" />
Window 級別
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
View 級別
// 如果是 software,會將 View 繪制到一個 Bitmap, // 然后依然是通過硬件加速將 Bitmap 繪制到 Canvas view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
LAYER_TYPE_NONE:普通渲染方式,不會返回一個離屏的緩沖,默認值。
LAYER_TYPE_HARDWARE:如果這個應用使用了硬件加速,這個 View 將會在硬件中渲染為 硬件紋理,如果應用程序并沒有被硬件加速,則其效果和 LAYER_TYPE_SOFTWARE 相同。
LAYER_TYPE_SOFTWARE:此 View 通過軟件渲染為一個 Bitmap。
檢查是否開啟了硬件加速
view.isHardware-Accelerated(); Canvas.isHardwareAccelerated();
如果 View 中要處理中文長文本,需要關閉硬件加速。因為每個中文編碼不一樣,緩存效果不理想。
監控
《Android 應用性能優化最佳實踐》2.8 章,主要利用 MainLooper 里的 Printer。
BlockCanary 開源庫
StrctMode
ANR
Activity 的 View:5 秒無響應
BroadcastReceiver:10 秒無響應
Service:20 秒無響應
ANR 時,系統會生成一個 traces.txt 的文件放在 /data/anr/ 下。通過 adb 命令將其導出到本地
$adb pull data/anr/traces.txt ~/Desktop
關于如何在Android項目中優化卡頓問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。