RecyclerView 一次性加載大量數(shù)據(jù)(2000)時,導致UI線程卡頓,頻繁GC的問題記錄

問題描述:

? ? ? ? 公司項目有這么一個需求,從后臺獲取與當前登錄用戶相關的其他所有用戶的數(shù)據(jù),并分類展示出來,然而某一天一個用戶說打開這個頁面的時候非常卡,并且會黑屏,有時會閃退。經(jīng)過實際測試發(fā)現(xiàn)與該用戶相關的其他用戶有2000多條數(shù)據(jù)。

問題的尋找過程:

當時想的就是因為數(shù)據(jù)過多導致頁面繪制的時候卡主線程了。

因為我是通過RecyclerView展示數(shù)據(jù)的,接著就想到一次性加載2000多條數(shù)據(jù)會卡頓,那我就分批加載,我將2000多條數(shù)據(jù)按每100條一批,顯示到RecyclerView中,然后發(fā)現(xiàn)問題依然存在。這個問題困擾了好多天,試了各種分頁加載,依然得不到解決。

后來偶然間我在adapter的onCreateViewHolder() 和 onBindViewHolder()中打了個計數(shù)的Log,發(fā)現(xiàn)2000多條數(shù)據(jù),每條數(shù)據(jù)加載的時候都會調(diào)用onCreateViewHolder()和onBindViewHolder()。當時就感覺不對,根據(jù)官方API的說法,RecyclerView只會 create當前顯示的Item,其他的未顯示的都是通過ViewHolder的復用來顯示的,我想我已經(jīng)發(fā)現(xiàn)問題所在了。。。呵呵呵??

然后我就想是不是我adapter寫的有問題呢 ,經(jīng)過和其他頁面RecyclerView 的adapter的對比,卻發(fā)現(xiàn)并沒有什么不同,這讓我又開始苦惱起來。。。。

經(jīng)過和其他頁面的一步步的對比,最終發(fā)現(xiàn)原來是activity中的布局文件中,RecyclerView 的外層套了一個NestedScrollView,導致RecyclerView 的每一條數(shù)據(jù)都會創(chuàng)建一個Item,在數(shù)據(jù)量小的時候發(fā)現(xiàn)不了,等數(shù)據(jù)量達到一定程度的時候就會導致由于創(chuàng)建的View過多,程序運行過程中產(chǎn)生了大量的垃圾數(shù)據(jù),所以才會導致進程不斷的發(fā)生GC,因而影響了UI主線程。

出現(xiàn)問題的布局文件:

<NestedScrollView

????????android:layout_width="match_parent"

????????android:layout_height="match_parent">

????????<LinearLayout

????????????android:layout_width="match_parent"

????????????android:layout_height="match_parent">

? ? ? ? ? ? ? ? ? ? ? ? <RecyclerView

????????????????????????????android:layout_width="match_parent"????????????

????????????????????????????android:layout_height="match_parent"????????/>

? ? ? ? </LinearLayout>

</NestedScrollView>


解決辦法:

1、因為我頁面中用不到NestedScrollView,這是以前頁面遺留的,因此去掉NestedScrollView后,問題就解決了。

2、經(jīng)過百度發(fā)現(xiàn)

//設置 這個可以避免以上問題 但也意味著失去了本身設計用來提供支持WRAP_CONTENT的功能了mRecyclerView.getLayoutManager().setAutoMeasureEnabled(false);

貌似也能解決,不過我還沒有試過。來源于NestedScrollView嵌套RecyclerView出現(xiàn)onBindViewHolder一直回調(diào)的問題 - CSDN博客

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容