記憶體優化策略

weixin_33860553發表於2018-02-06

引言


首頁功能完成後在使用的時候偶爾會崩潰,log一看oom了。

仔細想想現在的佈局結構確實會出現這樣的問題

只首頁這一個Fragment內的ViewPager就包含了21個子Fragment

其中每個子Fragment又包含了多個view每個view都有載入圖片,如何形容可怕呢?

單發現Fragment的直接子view就有100個,介面返回的。且子view可能是ViewGroup又包了view。

android profiler顯示記憶體超400M,圖片佔將近200M,記憶體優化亟待解決。

正文


先說一下原作:

之前有提到過首頁ViewPager設定了近10個快取(我只設定了3個),滑動內容時並沒有卡頓和oom,圖片的載入也很流暢。

有一個小細節引起了我的注意,當Fragment滑動到底部後在此滑到頂部時,圖片的載入效果是漸顯的。明顯做了手腳,先標記一下,至於是什麼暫時還沒搞懂。

優化

1、Fragment
onCreateView每次會inflate一個View出來,多Fragment來回切換時inflate會更多

        if (rootView == null) {
            rootView = inflater.inflate(R.layout.fragment_content, container, false)
        }

在每個Fragment內會存在多圖,因此onDestroyView時清除記憶體佔用

        Glide.get(context).clearMemory()
        System.gc()

2、ViewPager
設定ViewPager的快取數量

        viewPager.offscreenPageLimit=3

3、圖片格式
之前Glide操作的所有圖片為ARGB_8888此種格式一畫素會佔用32位4位元組。現在改為最小的RGB_565,這種格式佔16位2位元組,足足縮了一倍。

4、Glide
設定成只儲存,修改後的圖片

                    .diskCacheStrategy(DiskCacheStrategy.RESULT)

5、滑動時不載入圖片
給RecyclerView設定滑動監聽,當RecyclerView的狀態為SCROLL_STATE_IDLE時載入圖片

通過上述的操作圖片佔記憶體最高為130M且沒有oom,總覺得還差了點什麼,先標記這些以後再繼續

相關文章