Android應用開發—ViewPager FragmentPagerAdapter和FragmentStatePagerAdapter下Fragment的生命周期

ViewPager配合不同的PagerAdapter,對應Fragment的生命周期有著不同的表現,了解這個生命周期機制對于開發者選擇合適的PagerAdapter實現不同的效果,有著很大的幫助。

FragmentPagerAdapter和FragmentStatePagerAdapter的區別:

  • FragmentPagerAdapter:
    類內的每一個生成的 Fragment
    都將保存在內存之中,因此適用于那些相對靜態的頁,數量也比較少的那種;如果需要處理有很多頁,并且數據動態性較大、占用內存較多的情況,應該使用FragmentStatePagerAdapter。
  • FragmentStatePagerAdapter:
    正如其類名中的 ‘State’ 所表明的含義一樣,該 PagerAdapter
    的實現將只保留當前頁面,當頁面離開視線后,就會被消除,釋放其資源; 而在頁面需要顯示時,生成新的頁面(就像 ListView的實現一樣)。這么實現的好處就是當擁有大量的頁面時,不必在內存中占用大量的內存。

viewPager.setOffscreenPageLimit(X)對Fragment創建時機的影響:

如果ViewPager下有N個fragments,并設置了setOffscreenPageLimit(X),則當fragment1用戶可見時,其后面X個fragment也已經同fragment1一同預先創建完成。當滑動fragment1->fragment2時,第X+2個fragment完成創建,以保持當前fragment(fragment2)后有X個fragment已經創建完成作為緩存。

  • FragmentPagerAdapter和FragmentStatePagerAdapter差別:

如前面提到FragmentPagerAdapter不會釋放創建過的fragment,這樣當fragment1->fragmentN完成以輪切換后,從fragmentN->fragment1反方向切換時,不會再觸發fragment的創建,即onCreate()不會被調用。
而FragmentStatePagerAdapter做從fragmentN->fragment1反方向切換時則會繼續觸發fragment的創建以保障有X個fragment被創建并緩存著(因為大于X的fragment已經被釋放了)

總結:fragment的onCreate()總是預先被調用,且被調用的時機總是同當前用戶可見的fragment保持X個fragment的“距離“,即某個fragment的onCreate()被調用時,它的前X個fragment是用戶可見的。

奇怪的onResume():前面說明了onCreate()被觸發的規律,但是onResume()的觸發規律則十分奇怪,eg:有以下fragment,f1,f2,f3,f4當f1->f2時,f2的onResume()被觸發,當f2->f3時,f3的onResume()被觸發,當f3->f2時,f2的onResume()不會被觸發,當f2->f3時,f3的onResume()仍然被觸發,鑒于這個onResume()被觸發的規律很“混亂”,所以不宜做一些需要確定性的任務。(后面有機會在研究下了)

實際應用:

當fragment切換至用戶可見后,要做一些處理,比如請求網絡數據,更新當前頁面等。

經過前面的分析可知onCreate()和onResume()的觸發時機都不滿足以上要求:onCreate()會預創建,FragmentPagerAdapter下還會一直緩存,onResume()的觸發時機又沒有規律(正常情況下大家對于這種需求一般會想到resume()這類接口)。

我們可以利用setUserVisibleHint()接口實現該功能,即當本fragment為用戶可見時,該接口被觸發,以達到每次fragment切換為可見后,更新當前fragment頁面數據的目的。

實現類似網易新聞客戶端,ViewPager每次只加載當前頁。
如前所訴,使用FragmentPagerAdapter或者FragmentStatePagerAdapter都會默認多加載X頁(X通過setOffscreenPageLimit()設置,最小值為1)。

這個需求同樣通過setUserVisibleHint()來實現,將網絡請求加載頁面的處理,從onCreate()中移到setUserVisibleHint()中,這樣就實現了切換到頁面才進行更新的效果。

notes:貌似在某些廠商的rom上對FragmentPagerAdapter的緩存機制做了改動,導致緩存失效,這樣就要十分小心對緩存fragment生命周期的處理,盡量避免引用不在前臺展示的fragment。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450139.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Bash常用快捷鍵及其作用

Bash常用快捷鍵及其作用 在 Bash 中有非常多的快捷鍵,如果可以熟練地使用這些快捷鍵,可有效地提高我們的工作效率。只是快捷鍵相對較多,不太好記憶,這就要多加練習和使用。這些快捷鍵如表 1 所示。 表 1 Bash 常用快捷鍵快捷鍵作 …

Putty(菩提)遠程連接服務器教程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 百度不準直接用其圖片,我也懶得去偷,只是記錄下原文地址: https://jingyan.baidu.com/article/4543…

V8 中更快的異步函數和 promises

原文作者:Maya Lekova and Benedikt Meurer譯者:UC 國際研發 Jothy寫在最前:歡迎你來到“UC國際技術”公眾號,我們將為大家提供與客戶端、服務端、算法、測試、數據、前端等相關的高質量技術文章,不限于原創與翻譯。一…

Android應用開發—淺談MVX模式

MVX模式的文章太多了,這里不會再重述,關鍵我還不太懂,本文會從自己的一些思考,分析下MVX的分離思想,先占個坑! Android應用架構這篇文章最后講到: Activity和Fragment變得非常輕量。他們唯一的…

音視頻互動平臺--P2P通信技術

壓縮包可以從這里獲得:http://anychat.storage.aliyun.com/AnyChatCoreSDK_Win32(MBCS)_V4.5.zip 下載后,首先將其解壓到一個臨時文件夾中,然后開始后續工作。 編譯后我們獲得的是.lib文件。 AnyChat SDK向上層應用開放了內核的P2P連接策略…

pigz 壓縮

壓縮工具--pigz 壓縮: tar cvf - 目錄名 | pigz -9 -p 24 > file.tgz pigz:用法-9是壓縮比率比較大,-p是指定cpu的核數。 解壓: pigz -d file.tgz 這時候是tar包,那么在用 tar -xvf file.tar 解包。 速度比較gz.tar格式的壓縮…

exgcd模板

逆元模板P1082 1 #include <cstdio>2 #include <algorithm>3 4 int exgcd(int a, int b, int &x, int &y) {5 if(!b) {6 x 1;7 y 0;8 return a;9 } 10 int g exgcd(b, a % b, x, y); 11 std::swap(x, y); 12 …

有關eclipse for java ee版本遇到的坑( Context initialization failed)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 這幾天把以前網上看的視頻的源代碼拷貝到eclipse下面進行學習&#xff0c;當時用的是eclipse-jee-neon-M4a-win32-x86_64這個版本的ecli…

Android應用開發—TabLayout定制化Tab樣式

TabLayout的使用詳解基于此文&#xff0c;了解下setCustomView(childView)的使用。 TabLayout去掉指示器效果&#xff1a; app:tabIndicatorHeight"0dp"

即時通訊開發(逐行、隔行掃描)

早期的電視制式均采用隔行掃描&#xff0c;但是現在很多的高清、專業級的視頻采集卡都是采用逐行掃描模式&#xff0c;雖然現在的視頻設備和數字視頻技術已近有了很大的發展和進步&#xff0c;但是在時候中這兩種掃盲模式和顯示模式一直還存在&#xff0c;在前面我們介紹第四代…

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案ASP.NET Core 從2.2版本開始&#xff0c;采用了一個新的名為Endpoint的路由方案&#xff0c;與原來的方案在使用上差別不大&#xff0c;但從內部運行方式上來說…

ES6學習筆記

ES6學習筆記 在學習ES6的過程中做的一些記錄&#xff0c;用于未來的快速回憶。let&const 作用域的概念 ES6新增塊級作用域的概念&#xff08;一個大括號括起來的部分就是一個塊作用域&#xff09;let與const用于在塊級作用域中聲明變量&#xff0c;該變量僅在當前塊級作用域…

用jenkins創建節點

原料&#xff1a;(1)jre下載鏈接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html (2)jdk:下載鏈接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 一、創建SLAVE節點…

統計git倉庫一些commit數據

基于git統計某個人的代碼提交行數 git log --author"xxx" --prettytformat: --since1.hour.ago --numstat | awk { add $1 ; subs $2 ; loc $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc } - 統計倉…

JAXB: XML綁定的Java體系結構

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 用于XML綁定的Java體系結構&#xff08;JAXB&#xff09;是一種軟件框架&#xff0c;它允許Java開發人員將Java 類映射到XML表示。JAXB提…

解決 Script Error 的另類思路

2019獨角獸企業重金招聘Python工程師標準>>> 本文由小芭樂發表 前端的同學如果用 window.onerror 事件做過監控&#xff0c;應該知道&#xff0c;跨域的腳本會給出 "Script Error." 提示&#xff0c;拿不到具體的錯誤信息和堆棧信息。 這里讀者可以跟我一…

大平臺的局限

這篇文章算是二稿。初稿使的是慣用的賣弄筆法&#xff0c;寫到盡興時去查了查資料&#xff0c;哦草&#xff0c;錯了好多。悶悶不樂。后來就不敢再鬼扯&#xff0c;老老實實干巴巴地講觀點。 做產品的人都喜歡大平臺&#xff0c;好像男人都喜歡大胸脯女郎&#xff0c;但是胸脯大…

Lisenter筆記

EventListener與EventObject要完成在線用戶列表的監聽器&#xff0c;需要使用如下幾個接口&#xff1a;ServletContextListener接口&#xff1a;在上下文初始化時設置一個空的集合到application之中&#xff1b;HttpSessionAttributeListener接口&#xff1a;用戶增加session屬…

Android應用開發—重載fragment構造函數導致的lint errors

背景&#xff1a;在一次release打包中發現lint報以下錯誤&#xff1a; Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment] 根據后面的log提示是由于重載了fragment的構造函數&…

迅雷影音怎樣 1.5倍速度播放

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 看視頻 覺得播放速度太慢&#xff0c;想讓1.5速度播放可以這樣設置&#xff1a; 點擊快進按鈕&#xff0c;點一次變為1.1倍&#xff0c…