Android Activity卡頓原因總結

  • 內存泄漏導致內存佔用較高,導致JVM頻繁觸發GC。解決辦法:儘可能的減少生命週期長的對象引用生命週期短的對象。導致內存泄漏的原因有一下幾個:

    1.查詢數據庫後沒有關閉遊標cursor,各種資源文件沒有close。
    2.構造Adapter時,沒有使用convertView重用
    3.Bitmap對象不再使用時沒有調用recycle釋放內存
    4.靜態變量引用對象,Application引用對象。
    5.Handler造成內存泄漏。new Handler(){};創建Handler的方法會導致Handler對外部類Activity一個引用。而Message會存有對Handler引用,因此,如果Activity退出時這個Message還未處理,就會一直有Activity的引用。解決方法:創建一個Handler子類,而不是直接通過new Handler(){};的方式,在Handler裏保持一個對Activity的弱引用。在handleMessage時首先判斷引用的Activity不爲空。然後具體針對Activity的操作可以通過這個引用的Activity做相應的業務處理。

  • 加載大數據,佔用太多內存,同樣導致JVM頻繁GC。解決辦法:主要是Bitmap佔用太多內存。可以通過根據需要顯示的Bitmap寬高設定採樣率來壓縮圖片。另外,通過採用LRUCache方法避免。如果是其他的大數據比如3D模型數據,可以通過使用Native空間,使用ByteBuffer.allocate(size);

  • UI線程做耗時任務(數據庫操作,數據計算等),1秒繪製60幀纔不會卡頓,即16.6ms要刷新一次纔不會卡頓。解決方法:另起線程做耗時任務。
  • UI OverDraw。
  • 在包含ImageView的ListView中,等滑動停止後加載圖片。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章