Activity卡頓、變慢的原因
為準備面試,將最近所複習的內容以部落格的形式儲存起來,方便以後的查詢
從網上查詢了一些Activity卡頓原因,然後結合個人看法,總結如下:
(1)記憶體洩漏導致記憶體佔用較高,導致JVM頻繁觸發GC。解決辦法:儘可能的減少生命週期長的物件引用生命週期短的物件。導致記憶體洩漏的原因有一下幾個
A)查詢資料庫後沒有關閉遊標cursor,各種資原始檔沒有close。
B)構造Adapter時,沒有使用convertView重用
C)Bitmap物件不再使用時沒有呼叫recycle釋放記憶體
D)靜態變數引用物件,Application引用物件。
E)Handler造成記憶體洩漏。new Handler(){};建立Handler的方法會導致Handler對外部類Activity一個引用。而Message會存有對Handler引用,因此,如果Activity退出時這個Message還未處理,就會一直有Activity的引用。解決方法:建立一個Handler子類,而不是直接通過new Handler(){};的方式,在Handler裡保持一個對Activity的弱引用。在handleMessage時首先判斷引用的Activity不為空。然後具體針對Activity的操作可以通過這個引用的Activity做相應的業務處理。
(2)載入大資料,佔用太多記憶體,同樣導致JVM頻繁GC。解決辦法:主要是Bitmap佔用太多記憶體。可以通過根據需要顯示的Bitmap寬高設定取樣率來壓縮圖片。另外,通過採用LRUCache方法避免。如果是其他的大資料比如3D模型資料,可以通過使用Native空間,使用ByteBuffer.allocate(size);
(3)UI執行緒做耗時任務(資料庫操作,資料計算等),1秒繪製60幀才不會卡頓,即16.6ms要重新整理一次才不會卡頓。解決方法:另起執行緒做耗時任務。
(4)UI OverDraw。
(5)在包含ImageView的ListView中,等滑動停止後加載圖片。