成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ViewPager如何通過預(yù)加載機制提高滑動性能,以及如何屏蔽預(yù)加載策略的方法

開發(fā) 前端
調(diào)用instantiateItem來創(chuàng)建object,在FragmentPagerAdapter的instantiateItem這個方法中,創(chuàng)建的是Fragment,即緩存的就是Fragment,F(xiàn)ragment在創(chuàng)建時,會有UI操作,網(wǎng)絡(luò)操作,在還未可見的時候初始化Fragment非常消耗性能,所以應(yīng)該懶加載的方式來加載,不去緩存Fragment。

ViewPager默認(rèn)具有預(yù)加載機制,會預(yù)先加載當(dāng)前頁面前后的一定數(shù)量的頁面,以便在滑動時能夠迅速顯示新頁面。預(yù)加載的數(shù)量可以通過setOffscreenPageLimit(int limit)方法來設(shè)置,但最小值通常為1,意味著前后各預(yù)加載一個頁面。

public void setOffscreenPageLimit(int limit) {
    if (limit < 1) {
        Log.w("ViewPager", "Requested offscreen page limit " + limit + " too small; defaulting to " + 1);
        limit = 1;
    }

    if (limit != this.mOffscreenPageLimit) {
        this.mOffscreenPageLimit = limit;
        this.populate();
    }
}

下面看看預(yù)加載的是什么,在預(yù)加載數(shù)量更新的時候,執(zhí)行polulate()方法。

void populate(int newCurrentItem) {
    ViewPager.ItemInfo oldCurInfo = null;
    if (this.mCurItem != newCurrentItem) {
        oldCurInfo = this.infoForPosition(this.mCurItem);
        this.mCurItem = newCurrentItem;
    }

    if (this.mAdapter == null) {
        this.sortChildDrawingOrder();
    } else if (this.mPopulatePending) {
        this.sortChildDrawingOrder();
    } else if (this.getWindowToken() != null) {
        this.mAdapter.startUpdate(this);//被棄用了
        int pageLimit = this.mOffscreenPageLimit;//當(dāng)前的緩存頁面?zhèn)€數(shù)
        int startPos = Math.max(0, this.mCurItem - pageLimit);//計算緩存的開始位置
        int N = this.mAdapter.getCount();//adapter的子內(nèi)容的數(shù)量
        int endPos = Math.min(N - 1, this.mCurItem + pageLimit);//計算緩存的結(jié)束位置
        if (N != this.mExpectedAdapterCount) {
            String resName;
            try {
                resName = this.getResources().getResourceName(this.getId());
            } catch (NotFoundException var17) {
                resName = Integer.toHexString(this.getId());
            }

            throw new IllegalStateException("The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: " + this.mExpectedAdapterCount + ", found: " + N + " Pager id: " + resName + " Pager class: " + this.getClass() + " Problematic adapter: " + this.mAdapter.getClass());
        } else {
            int curIndex = true;
            ViewPager.ItemInfo curItem = null;
            //開始去找 ViewPager.ItemInfo
            int curIndex;
            for(curIndex = 0; curIndex < this.mItems.size(); ++curIndex) {
                ViewPager.ItemInfo ii = (ViewPager.ItemInfo)this.mItems.get(curIndex);
                if (ii.position >= this.mCurItem) {
                    if (ii.position == this.mCurItem) {
                        curItem = ii;
                    }
                    break;
                }
            }
            //沒找到就去創(chuàng)建 ViewPager.ItemInfo,并放入ArrayList<ViewPager.ItemInfo> mItems中
            if (curItem == null && N > 0) {
                curItem = this.addNewItem(this.mCurItem, curIndex);
            }

            int itemIndex;
            ViewPager.ItemInfo ii;
            int i;
            ·····一些計算操作,省略
        }
            
        this.mAdapter.finishUpdate(this);//完成條目的更新
        int childCount = this.getChildCount();

        for(itemIndex = 0; itemIndex < childCount; ++itemIndex) {
            View child = this.getChildAt(itemIndex);
            ViewPager.LayoutParams lp = (ViewPager.LayoutParams)child.getLayoutParams();
            lp.childIndex = itemIndex;
            if (!lp.isDecor && lp.widthFactor == 0.0F) {
                ViewPager.ItemInfo ii = this.infoForChild(child);
                if (ii != null) {
                    lp.widthFactor = ii.widthFactor;
                    lp.position = ii.position;
                }
            }
        }
        this.sortChildDrawingOrder();
    }
}

ViewPager通過計算當(dāng)前頁面的索引(mCurItem)和預(yù)加載頁面的限制數(shù)量(mOffscreenPageLimit或pageLimit)來確定需要預(yù)加載的頁面范圍。通過Math.max(0, mCurItem - pageLimit)計算預(yù)加載的起始頁面索引(startPos),通過Math.min(N-1, mCurItem + pageLimit)計算預(yù)加載的結(jié)束頁面索引(endPos),N是頁面總數(shù)。在這個范圍內(nèi),ViewPager會提前加載并創(chuàng)建頁面實例,以減少用戶滑動到這些頁面時的加載時間。

當(dāng)ViewPager的當(dāng)前頁面改變時,會根據(jù)新的當(dāng)前頁面索引和預(yù)加載范圍來加載或銷毀頁面實例。如果某個頁面實例不再處于預(yù)加載范圍內(nèi),它將被銷毀以釋放內(nèi)存。

ViewPager.ItemInfo addNewItem(int position, int index) {
    ViewPager.ItemInfo ii = new ViewPager.ItemInfo();
    ii.position = position;
    
    ii.object = this.mAdapter.instantiateItem(this, position);
    ii.widthFactor = this.mAdapter.getPageWidth(position);
    if (index >= 0 && index < this.mItems.size()) {
        this.mItems.add(index, ii);
    } else {
        this.mItems.add(ii);
    }
    return ii;
}

調(diào)用instantiateItem來創(chuàng)建object,在FragmentPagerAdapter的instantiateItem這個方法中,創(chuàng)建的是Fragment,即緩存的就是Fragment,F(xiàn)ragment在創(chuàng)建時,會有UI操作,網(wǎng)絡(luò)操作,在還未可見的時候初始化Fragment非常消耗性能,所以應(yīng)該懶加載的方式來加載,不去緩存Fragment。

ViewPager屏蔽預(yù)加載方式:

  • 「設(shè)置setOffscreenPageLimit(int limit)方法的limit為0」:

理論上,這是最直接的方法,實際上setOffscreenPageLimit(int limit)方法中的limit值有一個最小值限制,即使你設(shè)置為0,也會自動調(diào)整為1。因為ViewPager的設(shè)計初衷就是為了預(yù)加載相鄰的頁面以提高滑動性能。

  • 「自定義ViewPager」:

「方法一」:復(fù)制ViewPager的源代碼,并修改DEFAULT_OFFSCREEN_PAGES常量的值為0。

「方法二」:繼承ViewPager類,重寫setOffscreenPageLimit(int limit)方法,利用反射修改mOffscreenPageLimit屬性的值。這種方法可能涉及到對Android系統(tǒng)內(nèi)部實現(xiàn)的深入了解,并且可能隨著Android版本的更新而失效。

  • 「調(diào)整PagerAdapter」:

可以通過調(diào)整PagerAdapter中的instantiateItem和destroyItem方法來控制頁面的加載和銷毀。例如,可以在這些方法中實現(xiàn)更精細(xì)的頁面管理策略,以減少不必要的資源消耗。

  • 「懶加載技術(shù)」:

在Fragment或頁面內(nèi)容中使用懶加載技術(shù)。頁面只有在真正需要顯示時才會被加載。這可以通過在Fragment的setUserVisibleHint(boolean isVisibleToUser)方法中判斷頁面是否可見來實現(xiàn)。

  • 「注意事項」:

屏蔽預(yù)加載可能會影響ViewPager的滑動性能,當(dāng)用戶滑動到新的頁面時,該頁面可能需要花費更長的時間來加載。

在決定屏蔽預(yù)加載之前,權(quán)衡好性能和資源消耗之間的平衡。

責(zé)任編輯:武曉燕 來源: 沐雨花飛蝶
相關(guān)推薦

2011-03-17 10:37:07

JavaScript

2022-01-04 16:50:47

JavaScript圖片網(wǎng)站

2024-06-27 11:00:07

2024-10-22 08:00:00

2021-08-04 09:51:02

代理設(shè)計模式

2023-04-18 23:44:54

性能優(yōu)化開發(fā)preload

2019-09-24 09:25:05

Vue項目加載

2013-07-15 16:39:41

iOS多線程GCD實戰(zhàn)串行隊列實現(xiàn)預(yù)加載

2014-10-10 14:00:52

JavascriptHTML

2011-04-19 11:06:03

JavaScriptweb

2024-04-29 08:16:18

2021-12-17 00:02:28

Webpack資源加載

2011-06-09 16:14:14

2024-12-18 10:03:30

2024-12-26 09:27:51

2020-07-29 12:16:12

預(yù)訓(xùn)練自訓(xùn)練神經(jīng)網(wǎng)絡(luò)

2022-11-18 14:46:38

數(shù)據(jù)中心數(shù)字孿生

2011-04-11 14:56:09

Oracle性能

2021-07-14 14:06:06

CSS前端瀏覽器

2012-03-12 09:33:04

JavaScript
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 99re在线视频观看 | 日韩一区二区三区在线观看 | 精品久久久久久久 | 久久青 | 国产美女自拍视频 | 91亚洲精品在线 | 在线播放国产一区二区三区 | 中文字幕av第一页 | 色就是色欧美 | 久久香蕉精品视频 | 久久久久国产一区二区三区四区 | 国产欧美久久精品 | 中文字幕视频在线免费 | 免费在线成人 | av香港经典三级级 在线 | 国产欧美一区二区三区日本久久久 | 久久综合一区 | 精品视频在线观看 | 久久夜夜 | www.天天干.com | 国产91在线播放 | 国产日产精品一区二区三区四区 | 欧美精品在线播放 | 久久久久国产一区二区三区 | 久久久久久国产精品免费免费 | 日韩免费在线观看视频 | 亚洲欧美日韩在线一区二区 | 国产精品毛片一区二区三区 | av一区二区三区 | 国产在线对白 | 国产不卡一区在线观看 | 日本中文字幕一区 | 国产精品欧美精品日韩精品 | 日韩av中文| 欧美一区二区三区久久精品 | 国产精品无码久久久久 | 亚洲小视频在线播放 | 中文字幕在线观看 | 久在线| 午夜午夜精品一区二区三区文 | 午夜成人免费视频 |