1. 程式人生 > >Android記憶體優化個人經歷

Android記憶體優化個人經歷

專案從3月開始做,維護加上各種加功能,App直線增肥,從原來20M的性感美女變成的如今50M的中年大媽,各種繁亂的邏輯要了老命了。特別是上個月的記憶體洩漏導致的卡頓,能把人憋死。App一跑記憶體佔用就300M+,好點的手機還能撐一陣,執行記憶體只有2G的用不到10分鐘就各種ANR。好了廢話不多說,說下我的優化之路。

一、一開始我也是各種百度,然後我懷疑是強引用過多,就寫了個軟應用工具類,把用的強應用都替換了

public static void setSoft(String objname,Object object){
    softReference=new SoftReference<>(object);
softReferenceMap.put(objname,softReference); } public static <T extends Object> T getSoft(String key){ SoftReference<Object> softReference=softReferenceMap.get(key); if(softReference==null){ return null; }else { return (T)softReference.get(); } }
不知道寫的對不對啊,大神請指正。不過並沒有卵用,該卡還是卡。

我想我得換個思路,得把問題找到,於是我升級了Android Studio 3.0 ,把自帶的Android Profiler調出來

頻繁的回收會導致滑動卡頓,進而引發OOM.檢測出來發現是商城的Activity物件發生了洩漏。導致Activity物件被持有無法被回收。

找到原因就是下一步

詢漏之旅:記憶體洩漏無法以下幾點:1.註冊了廣播沒反註冊 2.執行緒沒取消 3.內部類非靜態 4.單例  5.資料庫遊標未關閉 6.Handler 7.webview資源未釋放

我把所有都試了一遍,記憶體洩漏解決了,不過效果不大,記憶體佔用還是很高,後面我又加了阿里雲對展示圖片進行裁剪,減少記憶體佔用 。到了這一步我也快瘋了,沒辦法,執行十分鐘照樣卡,再加上商城又加了一個多執行緒的限時搶購,用timer做的。那記憶體,酸爽的一bi。

換個思路:後面我想了下是不是控制元件的原因呢,畢竟該優化都做了,唯一沒動的就是Xml檔案了,沒錯,佈局過於複雜也會引發記憶體佔用過大,因為商城需求的多樣化,佈局被我寫得臃腫不堪,各種巢狀,Scrollview套LinearLayout  ,LinearLayout加ListView  ,ListView裡還有RecyclerView 。。。說說解決辦法:去掉scrollview  用Gridview替換掉Recycleview  把大列表頂部作為一個頭佈局直接進行載入,頭佈局裡的邏輯在頭佈局的initHeadView方法裡處理。做到這基本就能保證在配置不是那麼好的手機上完美運行了

          當然,程式碼優化之路任重道遠,願我的經歷能幫助到你。