我最近上班又遇到一個小難題了,就是如題所述:ViewPager預加載的問題。相信用過ViewPager的人大抵都有遇到過這種情況,網(wǎng)上的解決辦法也就那么幾個,終于在我自己不斷試驗之下,完美解決了(禁止了)ViewPager的預加載。
好了,首先來說明一下,什么是ViewPager的預加載:ViewPager有一個 “預加載”的機制,默認會把ViewPager當前位置的左右相鄰頁面預先初始化(俗稱的預加載),它的默認值是 1,這樣做的好處就是ViewPager左右滑動會更加流暢。
可是我的情況很特殊,因為我 5 個Fragment里有一個Fragment是有SurfaceView的,這樣造成的問題就是,我ViewPager滑動到其相鄰頁面時,含有SurfaceView的頁面就會被預先初始化,然后SurfaceView就開始預覽了,只是我們看不到而已。同樣的,當我們從含有SurfaceView的頁面滑倒其相鄰的頁面時,SurfaceView并不會回調(diào)其surfaceDestory方法。于是這給我造成了極大的困擾。
ok,下面言歸正傳,到底該怎么禁止ViewPager的這個預加載問題呢?
方案1:網(wǎng)上大多數(shù)說法是 懶加載,即讓ViewPager預加載初始化UI,而具體一些數(shù)據(jù),網(wǎng)絡訪問請求等延遲加載。這是靠Fragment里有一個setUserVisibleHint(boolean isVisibleToUser)的方法,我們可以在這個方法里做判斷,當其True可見時(即切換到某一個具體Fragment)時才去加載數(shù)據(jù),這樣可以省流量。但這里并不滿足我的需求,因為某一個Fragment并不會在ViewPager滑動到其相鄰的Fragment時銷毀。這個只可以解決部分人問題。
首先我們來深入了解下ViewPager的預加載機制:
上文提到過,ViewPager默認預加載的數(shù)量是1,這一點我們可以在ViewPager源碼里看到。