平板以及小運存手機APP使用RecyclerView卡頓解決方案
阿新 • • 發佈:2018-12-17
前言
最近一直在做平板類應用的開發,關於自動售貨機的系統,我也是第一次接觸硬體以及Android盒子的開發,從剛開始的陌生到現在的熟悉,感覺還是收穫挺多的,最近專案快要上線了,介面真的很簡單,展示商品用的只是RecyclerView,也沒有巢狀,但是就是滑動卡頓不流暢,後來發現了幾個不常用的方法,跟大家分享下~~
RecyclerView的前期的優化方案:
剛開始發現問題以為是優化item佈局,滑動時不載入圖片,使用glide載入圖片時不進行記憶體快取,載入縮圖,載入圖片進行壓縮等方案。
Glide.with(context) .load(url) .diskCacheStrategy(DiskCacheStrategy.RESULT) .skipMemoryCache(true) //不進行記憶體快取 .thumbnail(0.3f) //載入縮圖 .override(150, 150) //對圖片進行壓縮 .placeholder(R.drawable.icon_goodsdefault) .crossFade() .into(imageview);
上面是Glide的優化,說是優化其實只是使用方式,這個都檢查之後,效果還是有的,但是收效甚微,於是就去另尋方法,終於找到了最終的破解之法:
重點:
recyclerview.setHasFixedSize(true);
如果所有的 Item 的高度固定大小,使用上述程式碼這樣可以減少測量次數,尤其是對於 GridLayoutManager。
recyclerview.setItemViewCacheSize(10); recyclerview.setDrawingCacheEnabled(true); recyclerview.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
然後RecyclerView可以設定自己所需要的ViewHolder數量,並且設定draw快取。 通過上邊的兩步已經大大改善了滑動的情況,但是我的資料需要根據分類進行notifyDataSetChanged(),然後把這個也優化了一下:
mAdapter.setHasStableIds(true)
使用上述程式碼的話,Adapter中的getItemId要重寫成如下,否則資料重新整理會出錯。
@Override
public long getItemId(int position) {
return position;
}
小結
在平時手機開發中,基本沒有進行過這麼深度的優化,但是我的android盒子運存只有1G,在繪製的時候肯定比手機差的太多,這裡寫出來給大家分享下,有問題的同學可以私信我或者QQ都可以~~
一個android小菜鳥,寫了一篇小總結,祝大家工作順利~~~