ViewPager預載入及其優化

2021-08-10 15:38:58 字數 2390 閱讀 3003

前言

以前用viewpager做輪播圖,左右滑動感覺挺流程,沒感覺有卡頓的現象;但實現現在又用viewpager做日曆,日曆的模組全部是用canvas畫出來的,在這裡有一些演算法要去處理,viewpager左右滑動好像沒那麼流暢了。這個時候我就在想如何優化viewpager,盡量讓它左右滑動的時候不那麼卡頓,至少測試不找自己麻煩。先要研究如何優化,那麼就一定要了解viewpager的預載入機制。

正文

首先我們將viewpager的可滑動範圍設定為3000,在這裡我故意設定成3000

public yueliadapter(context context, typedarray array, yueliview monthcalendarview, class clzz, resources resources) 

@override

public int getcount()

@override

public object instantiateitem(viewgroup container, int position)

那麼初始化的時候,我們發現日誌出現了這麼3條資訊

沒錯就是這3條資訊,最開始的時候列印了1500,我們發現這個數字就是3000的一半,是的,在初始化的時候我們設定了getcount()的數值是3000,那麼在執行instantiateitem(viewgroup container,int position)的時候,這裡面的position的值就是1500,viewpager自動會從position=getcount()/2位置載入最開始的頁面,然後向前預載入乙個頁面,再向後預載入乙個頁面,也就是載入了position=1499的頁面和position=1501的頁面。

我們移動頁面

當我們再向左滑動一頁的時候,那麼這個時候viewpager顯示的是position=1501的頁面,但是它還會再向後面再預載入乙個頁面,也就是position=1502的頁面。如果一直向後就一直預載入,直到當position=3000的時候就不會預載入了。那麼向前預載入也是這樣的原理,當我們的頁面在position=1501這個頁面的時候再向右滑動一頁,那麼當前顯示的就是position=1500的頁面,viewpager也會再向前預載入乙個頁面,也就是position=1499的頁面。

那麼問題就來了,position=1499的這個頁面不是已經載入過了嗎,再載入一遍不是又要浪費效能了嗎?那麼怎麼能讓載入過的頁面不再載入了呢?其實我們可以用sparsearray去儲存載入過的頁面,如果下次再預載入的時候,已經儲存過的頁面就不用在載入了,這樣就不用再耗費效能了、也就沒那麼卡頓了。那麼為什麼用sparsearray而不用hashmap,其實sparsearray效能更好,更加節省記憶體,這裡就不多做解釋了。

public class yueliadapter extends pageradapter 

@override

public int getcount()

@override

public object instantiateitem(viewgroup container, int position)

container.addview( mviews.get( position ) );//從sparsearray裡面獲取頁面view用於顯示

return mviews.get( position );//從sparsearray裡面獲取儲存的頁面view

}public void setskin(class clzz, resources resources)

}public void refresh()

}private int getyearandmonth(int position)

@override

public void destroyitem(viewgroup container, int position, object object)

@override

public boolean isviewfromobject(view view, object object)

public sparsearraygetviews()

public int getmonthcount()

}

ViewPager的預載入設定

在使用viewpager的時候滑動過程中多個fragment會被銷毀之前的,預載入前後兩個頁面,如果想不讓它 頁面也就意味著不用再次請求網路來獲取資源 設定viewpager的介面卡 mpager.setadapter paggeradapter 設定viewpager的初始頁碼是第乙個fragme...

mysql 預載入快取 預載入與快取

最近的專案中為了能夠提公升那麼一丟丟效能,嘗試了一下對 chunks 進行預載入處理。雖然做了非同步載入的處理,但是專案大小決定了還是有多個非同步的 chunk.js 需要進行預載入,這裡我指的是 preload與a webpack plugin for injecting into htmlweb...

ViewPager Fragment 預載入問題

viewpager 預設載入兩個fragment 左右各乙個 viewpager.setoffscreenpagelimit 1 其中引數可以設為0或者1,引數小於1時,會預設用1來作為引數,未設定之前,viewpager會預設載入兩個fragment,左右各1個。如果要讓fragment 只預載入...