Fragment實戰總結

2020-12-04 營長和他朋友的百家號

Fragment實戰總結

更少的廢話,更多的知識

普羅古拉姆

前言:這幾年想要專心做技術了,起步比較渣,但相信堅持會帶來改變,之前的公眾號現在拿來寫技術博客了,當然,也會寫一些其他有趣的東西。

Fragment

生命周期

Fragment是Android開發中必不可少的組件,這裡就不介紹Fragment的定義和基本用法了,感興趣可以自己去找找,在使用任何Android 視圖組件的時候,一定要先搞清楚生命周期,這樣你才能清楚的了解到現在的視圖的狀態是什麼樣子的。如圖,Fragment的生命周期可以分為11段,對比前面的activity7段來說,多了不少。

①onAttach生命周期走到這個方法的時候,fragment已經和activity綁定好了。方法經常用來對context進行賦值,傳進來的context是fragment依附的activity。比如下面的代碼。

@OverridepublicvoidonAttach(Context context){super.onAttach(context); activity = (Activity) context; Log.i("zyy_test", "Fragment" + str + " onAttach"); }

②onCreate方法中經常用來接收fragment newInstance中傳入的數據。比如下面的代碼

publicstatic BaseFragment newInstance(String str){ Bundle args = new Bundle(); args.putString("str", str); BaseFragment fragment = new BaseFragment(); fragment.setArguments(args);return fragment; }@OverridepublicvoidonCreate(@Nullable Bundle savedInstanceState){super.onCreate(savedInstanceState); Bundle bundle = getArguments(); str = bundle.getString("str"); Log.i("zyy_test", "Fragment" + str + " onCreate"); }

③onCreateView方法常用來初始化view,相當於activity oncreate方法中的setContentView方法。比如下面的代碼

@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){ View view = inflater.inflate(R.layout.fragment_layout, null); TextView txt = view.findViewById(R.id.txt); txt.setText(str); Log.i("zyy_test", "Fragment" + str + " onCreateView");return view; }

④onActivityCreate生命周期走到這個方法的時候,activity已經準備好了,比如在某些場景,fragment需要使用到activity中的一些方法或者變量,如果activity沒有完全創建好就使用,獲得的數據就是默認值。

總結一下:

1、靜態的view不需要使用這個方法

2、保存view狀態對的時候需要這個方法。

3、訪問父activity view層的時候需要這個方法。

@OverridepublicvoidonActivityCreated(@Nullable Bundle savedInstanceState){super.onActivityCreated(savedInstanceState); Log.i("zyy_test", "Fragment" + str + " onActivityCreated"); }

其他的生命周期階段平平無奇,這裡就不介紹了。大家可以自己在activity中寫一個fragment,觀察一下fragment和activity的生命周期的關係。這個也平平無奇,沒啥可說的。

接下來重點介紹一下fragment在viewpager中的生命周期變化。fragment用在viewpager中的場景數不勝數,今日頭條,掌上生活發現頁,各種內容流app都有。但fragment+viewpager之後,fragment的生命周期的觸發時機有點不一樣。

viewpager有個預加載的特點,這裡不展開說,只要知道有這麼個事就行。預加載的值最小是1。也就是說viewpager會加載當前的fragment和當前fragment左右各1個fragment。在這裡,fragment還有個生命周期階段叫setUserVisibleHint,代碼如下。

@OverridepublicvoidsetUserVisibleHint(boolean isVisibleToUser){super.setUserVisibleHint(isVisibleToUser); Log.i("zyy_test", "Fragment" + str + " setUserVisibleHint " + isVisibleToUser); }

在viewpager中的fragment生命周期的第一階段不是onAttach,而是setUserVisibleHint,這個方法用來判斷,當前fragment是否可見,這個方法對於viewpager中Fragment的數據懶加載起到至關重要的作用。

也就是說在viewpager中,一共有三個fragment的生命周期會走到onResume這個方法,三個fragment都做好了,顯示的準備。但是只有一個fragment顯示了,就是那個被用戶選中的fragment。現在有ABC三個fragment,B是顯示的,如果用戶此時將Bfragment劃到Cfragment,那麼此時viewpager做的事情就是預創建Dfragment,並且將Afragment結束掉,但是不會onDestroy,更會不onDetach。只是走到onDestroyView(把view銷毀了),而剛才劃出屏幕的BFragment,通過控制臺的log可以發現,什麼都沒有列印。這意味著,Bfragment的生命周期一個都沒有走,此時Bfragment依然是一個活蹦亂跳的view,只是不可見罷了。

當開發者了解到viewpager中fragment的生命周期變化時機後。代碼開發就會變得得心應手了。

很遺憾我的電腦無法打開github網頁,目前代碼無法上傳,無法供大家一起探討。大家可以自行寫個小demo驗證上述說明。

Fragment

懶加載

這個懶加載主要是針對viewpager中使用fragment來說的,因為我們有時並不希望,一次加載多頁fragment數據,當翻到某個頁面的時候再加載數據就行,這樣做的一個好處就是能提高軟體性能,並且幫助用戶節省了流量。

fragment懶加載最重要的方法就是剛才介紹過的setUserVisibleHint方法。我們在fragment中設置一個變量比如叫isVisisble,用來判斷fragment是否可見,我們只需要在setUserVisibleHint方法中將isVisibleToUser這個變量賦值給isVisisble。另外還需要設置一個變量,用來判斷fragment依附的activity是否準備好了。比如叫isPerpared當系統回調onActivityCreate時,將這個值置為true即可。通過這兩個變量,可以確保懶加載的順利進行。

Fragment

實戰問題解決

這裡分享一個我在實際工作中遇到的一個關於fragment+viewpager+tablayout的問題。

問題背景:我做了一個功能,有多個切換tab,需要是每次切換的時候都刷新,刷新的時候會從服務端獲取數據,我會傳遞一個時間戳給服務端,第一次進頁面傳遞null,下發所有的數據,這是所謂的全量查詢。後面再請求,傳遞上次下發的數據的最後一條時間戳,服務端就將這條數據之後的數據下發,這就是所謂的增量查詢數據。訪問服務端都是異步進行的,數據從服務端拿到後,我會回調顯示。

問題描述:當我進入頁面後,在兩個未展示過的tab之間,來回快速點擊,然後發現本來應該只有一條數據,但是經過操作後,發現會出現2條甚至更多重複的數據。

問題原因:當我快速交替點擊的時候,兩個頁面都在不停地向服務端發送請求,最為致命的是,如果服務端響應比較慢,而我手速比較快,那麼當我第一點擊Afragment的時候發送了一個時間戳為null的請求,然後交替點擊再次點擊Afragment的時候服務端請求還沒下來,我又發送了了一次時間戳為null的請求,這樣服務端就返回了兩次全量數據。

解決方案:我設置了一個原子類型(AtomicBoolean)的布爾變量isSync。大家感興趣可以自己查一下原子類型。當我調用服務端方法的時候,我會先判斷isSync是否為true,為true表示正在調用,則不會開啟本次調用。如果為false,則首先將isSync置為true,然後再調用服務端。當數據返回後,再將isSync置為false,表示本次調用結束。這樣,同一個fragment就不會多次調用服務端,而導致數據異常的問題了。

注意:這個變量是加在fragment中的,不是網絡訪問代碼中,所以這個變量只對同一個fragment起作用,不同fragment之間是沒有影響的。這樣就保證了不同fragment之間的並發訪問服務端數據。

很開心自己能開始寫技術博客了,希望能堅持下去,我的目標是成為一名Android高級工程師。我不關心有沒有人看我的博客,但是歡迎大家指出我任何方面的不足。

一起來變強吧!

圖片來源:花瓣@斑斕Oo

相關焦點

  • :分享Taq個人總結和實戰指揮的一些心得!(下篇)
    :分享Taq個人總結和實戰指揮的一些心得!個人經驗總結:這是一個考驗坦克和治療的Boss,野團戰鬥時長基本在10分鐘左右,需要坦克和治療精神保持高度集中!左右兩邊治療組裡安排儘可能多的薩滿,保持儘可能多的回藍,安排牧師專門負責重壓打擊的套盾!戰士坦保持全程石盾藥水,這裡戰士坦的進出走位尤其重要,如果有些坦克走位不熟練吃到奧爆,那麼可以提醒坦克等Boss腳底下出白光以後進行進出走位,這樣基本可以做到萬無一失!
  • 全警實戰練兵 | 以問題為導向 以實戰為路徑
    微課堂篇幅短小、貼近實戰、注重操作、即學即用,方便民警隨時隨地學習,紮實掌握法律法規,理論與實踐相結合,提高西安公安碑林分局民警執法辦案能力。    天天練實戰見促進警務技能多點提升  為確保大練兵活動取得實效,金花路派出所緊扣政治練兵
  • 別緊張,是「雙盲」實戰應急演練
    這並不是真的出現事故,而是坪山2018年坪山區成品油管道事故「雙盲」實戰應急演練現場。11月21日,在前期開展動員部署和推演準備的基礎上,坪山區安監局組織開展了本場演練,區安監局領導朱鹹勇擔任現場指揮官,坪山區危險化學品事故應急指揮部20個主要成員單位及8支下屬救援隊伍、中石化大鵬灣站及搶維修隊(市局危化三隊)等共計45輛車,168人參加此次演練。
  • 關於混(絮)凝劑實戰經驗的總結!
    四、關於混(絮)凝實戰經驗的總結1、問題描述由於進水濃度低,我們也有加麵粉和尿素的,加PAM對於汙泥回流有沒有影響?如果不加PAM,讓老化的汙泥隨水帶走,這樣做好不好?解答:1)加PAM對生化系統不好的。
  • 雙節棍實戰中的移動步伐
    雙節棍實戰是一個很敏感的話題,尤其是在當下武術被質疑的時代,但我個人認為,正是由於如此,我們才更應該去探討關於實戰上的一些東西和訓練方法,通過不斷的探索,把這種兵器或是這類武術的優勢,通過現代科學的訓練方法將其再次提升。雙節棍的實戰,或者說是雙節棍的對練,它的步伐是怎麼樣的呢?
  • 先驅七want實戰測評:不一般的國產新秀!
    我算了算日子,也該是給大家出一期實戰測評了,再不出實戰測評我怕你們手中40米的大刀快收不住了。 今天就給大家帶來這一雙大家頗感興趣的先驅7Want實戰測評,一起來看看叭!
  • KT5和歐文6哪個好 KT5和歐文6實戰對比
    安踏KT5自發售以來就吸引了不少小夥伴們的注意,那麼安踏KT5實戰性能如何?KT5和歐文6相比,哪個更耐磨?哪個實戰性能更好?下面就讓小編帶領大家一起來看看吧!KT5實戰測評包裹性:kt5包裹是目前KT系列最強,綁帶拉緊效果十分明顯。
  • 汙泥培養與馴化的實戰總結!
    北極星水處理網訊:通過工程實例總結,如何縮短汙泥培養與馴化的時間以及減少在過程中容易出現的問題,從汙泥的投加、調試以及按設計廢水的滿負荷運行,確保好氧生化設施裝置一次性運行正常。活性汙泥馴化應遵循的原則循序漸進、有的放矢、精心控制,正確判斷,科學總結。1. 汙泥的投加先把生化池加滿廢水或池體積的四分之三(清水:汙水=1~2:1,有條件的可以直接加清水),接種汙泥投加量按池體積的5%幹汙泥計算。汙泥投加一般採用把汙泥投加到剩餘汙泥池用汙泥潛水泵抽到生化池。
  • 北大教授耗時一年編寫最新版Spring Boot企業級應用開發實戰PDF版
    故筆者將以往系列課程中的技術做了總結和歸納,採用目前最新的Spring Boot 2技術來重新編寫了整個教學案例,整理成書,希望能夠彌補Spring Boot在實戰方面的空白,使廣大Spring Boot愛好者都能受益。本書圍繞如何整合以目前最新的Spring Boot 2版本為核心的技術棧,來實現- 個完整的企業級博客系統而展開。
  • 陰陽師SR蠍女好用嗎 陰陽師SR蠍女實戰解析
    蠍女實戰好不好用?新SR式神蠍女即將在正式服推出,部分玩家已經搶先體驗了一下。雖然是sr式神,但是感覺還是不錯的,值得入手哦,下面帶來陰陽師新式神蠍女實戰強度解析,一起看看吧。陰陽師SR蠍女好用嗎 陰陽師SR蠍女實戰解析定位先說這個式神的定位,你指望她打輸出基本上沒戲,傷害方面並不是很強,面板看著不錯,但是技能係數過低導致實戰中的傷害確實是不行
  • 經歷多個中臺項目後,我總結了一套中臺實戰框架
    作者從理解中臺和建設中臺兩個方面出發,對MSS建設框架進行了詳細闡述,並總結了自己的相關思考,與大家分享。大家看到這個圖的第一感受是什麼?帶著這兩個問題在我完成了多個中臺項目建設後,我自己總結出來了一個中臺的通用解決方案,下來我們就來談談剛才那個全景圖是如何建設出來的。
  • 實戰總結:如何將需求轉化為PRD?
    本文較長,是工作實戰經驗與一些理論的結合。文章分為3部分:需求流程、需求流程名詞解釋、需求流程詳解。注意,有些需求往往不需要詢問用戶,例如註冊、設置、用戶信息管理等基本需求,一方面這是基礎的普遍性需求,自己容易判斷;另一方面這些功能有足夠的產品早已做得非常完善,可以參考;而且前人已總結了足夠多的互動設計原則供我們參考。這一步顯得有些漫無邊際,仿佛從一個點迅速擴展成一張網,好像失去了核心。沒關係,下一步要做的,就是從這些漫無邊際中抽離出關鍵。
  • 訓練有素未實戰過的士兵,與沒訓練卻實戰過的士兵,哪個更厲?
    訓練有素未實戰過的士兵,與沒訓練過卻實戰過的士兵,究竟哪個戰鬥力更強呢?對於軍隊來說,到底是實戰經驗更重要,還是訓練水平更重要呢?有人認為實戰經驗遠要比訓練過程更加厲害,實戰經驗都是靠人命堆出來的,上過戰場的能活下來的軍人基本都是精英級別。
  • 耐克HD2018實戰測評
    耐克HD2018實戰測評 耐克的Hyperdunk系列給大家都留下了相當好的印象,小夥伴們也是對這款系列非常的期待
  • 火影忍者手遊:絕跡戰場實戰測評,BOSS很強,但死得很快
    本期為大家帶來火影手遊更多玩法中的絕跡戰場實戰測評,在大蛇丸實驗後,火影手遊也是推出了第二個BOSS——融合白絕,經過一周的實戰,文太也是總結了白絕這個BOSS的一些特點和玩法,那麼我們首先介紹一下BOSS:白絕和之前的實驗體相比,血量少了特別多,在文太的實戰中,忍者勝利的場次裡有70%都是以白絕被擊殺結束的,這和大蛇丸實驗的情況差別非常大,而且白絕的技能在沒有持柱的情況下傷害不高
  • 樹立實戰實訓鮮明導向!消除訓練與實戰的「標準之差」
    只有在實戰背景、複雜條件下進行連貫作業考核,才能檢驗單兵綜合運用各項技能、戰術的真實水平。「龍虎榜」冠軍易主現象,在該旅引發了實戰化訓練的「標準」之辯。士官黃偉東,曾代表中國陸軍參加國際軍事競賽。他說,在國際賽場上,檢驗單兵綜合作戰能力往往採取連貫演練的方式,將多個體能與戰鬥技能課目穿插在競賽中。「進入作戰狀態,根本沒有喘息的機會。」
  • 適合後衛的實戰籃球鞋推薦
    下面就和趣流網的小編一起來看一下關於實戰籃球鞋的相關信息。AJ13aj13這雙鞋排除性價比,單純的實戰性能拿到現在依然是實戰鞋中的箇中翹楚,穩定紮實的中底飛龍,天馬行空的外底設計兼具放側翻和抓地力,標準體積的前後zoomair提供快速的反應和舒適的緩震,巨大的碳板提供相當不錯的抗扭轉與助推,除了以現在的眼光來看包裹和透氣稍落後,但是瑕不掩瑜,依然是一雙頂級實戰鞋款。
  • 資料|《常用數據挖掘算法總結及 Python 實現》
    今日資料推薦《 常用數據挖掘算法總結及 Python 實現 》這份資源非常適合相關的從業人員或大數據愛好者,該文檔總結了常用的數據挖掘的算法原理以及 Python 實踐內容,為初學者提供良好的參考資料from=leiphonecolumn資料 | 《 Pytorch 深度學習實戰 》資料 | 《 面向機器學習的特徵工程 》 資料 | 程式設計師面試寶典 第 5 版 資料 | 《 機器學習數學基礎 》
  • 實戰教官「拍了拍你」——讓警務實戰技能形成肌肉記憶變成條件反射
    實戰教官「拍了拍你」——讓警務實戰技能形成肌肉記憶變成條件反射 2020-11-27 18:12 來源:澎湃新聞·澎湃號·政務