Fragment的陷阱

之前作過的一個項目,Fragment嵌套高德地圖,當再次進入Fragment的時候,會出現奇怪的現象。嵌套的地圖會出現滑動不動的狀況,起先還覺得是高德的bug呢,通過一番研究,終肯定這是一個坑。android

先對Fragment作一個簡單的介紹,借用csdn上朋友寫的一段內容。 微信

Android在3.0中引入了fragments的概念,主要目的是用在大屏幕設備上--例如平板電腦上,支持更加動態和靈活的UI設計。平板電腦的屏幕要比手機的大得多,有更多的空間來放更多的UI組件,而且這些組件之間會產生更多的交互。Fragment容許這樣的一種設計,而不須要你親自來管理 viewhierarchy的複雜變化。 經過將activity的佈局分散到fragment中, 你能夠在運行時修改activity的外觀,並在由activity管理的back stack中保存那些變化。網絡

使用過Fragment的同窗都知道,它的使用至關的簡單,基本上和Activity中同樣,就是生命週期函數稍稍多了點。今天不是介紹Fragment如何使用,而是介紹一個Fragment中的一個坑。如今至關多的APP都有如下三種設計風格。函數

1、底部TAB,通常3-5個,點擊某個TAB,上面頁面也隨之切換,如QQ、騰訊微博、新浪微博。早期的時候Android開發者們都會使用TabActivity去實現,可是TabActivity存在一些問題,也不符合Andoid的單窗口設計的原則,因此已經被廢棄,不推薦你們繼續使用。若有業務需求,請優先考慮使用Fragement。佈局

2、頂部TAB,通常也是3-5個左右,相對於底部TAB風格,頂部TAB通常會引入ViewPager + Fragment的實現方式,這樣能夠作到左右切換,如微信。優化

3、側邊TAB,也就是SlidingMenu + Fragment或者MenuDrawer + Fragment。這種風格自去年起,風靡的一發不可收拾,前段時間乾貨分享講的一期就是這個,代碼也開源在了Github上,有興趣的朋友能夠下載瞭解下。出門右轉,查看歷史消息《一個比較酷的項目界面分享,乾貨十足》。.net

上述三種風格中使用到的Fragment,通常很容易會被你們忽略了一個問題。那就是當和Fragment關聯的view hierarchy正在被移除時,不會執行onDestroy()方法,而是會調用onDestroyView()。好比上述的風格二ViewPager + Fragment,默認狀況下當ViewPager滑動到第三頁的時候,第一頁的Fragment就會執行onDestroyView,當再次滑動到第二頁的時候,第一頁的Fragment的onCreateView又會從新執行繪製頁面。伴隨而來的問題就是成員變量要從新賦值一次,辛苦耗時加載出來的頁面又要從新加載一次,這樣也就給內存增長了無心思的壓力,用戶體驗上也不大友好,尤爲在有網絡請求等開銷時長比較長的狀況下。設計

那有沒有上面解決辦法呢?答案是確定的。onDestroyView的執行和Activity的onDestroy不同,不會銷燬當前的頁面,因此Fragment的全部成員變量的引用都還在。那就好辦了,咱們在onCreateView的時候,先判斷該取到的數據是否爲空,好比Fragment的根視圖rootView,網絡請求獲取到的數據等,若是不爲空就不用再次執行。這樣一來也就避免了上述說的那些問題的存在了。blog

可是須要注意的一點就是,若是重用rootView的話,必定要記得在onDestroyView裏面把rootView先給移除掉,由於已經有過父佈局的View是不能再次添加到另外一個新的父佈局上面的。代碼以下生命週期

這樣也就解決了最前面我遇到的那個bug,因爲每次進入都會建立一個MapView,不少地圖疊在了一塊兒,因此就出現了"滑不動"的奇怪現象。

今天分享的只是一個優化策略罷了,但願能幫助到你。

 

若是以爲對你有所幫助,歡迎你們訂閱個人微信公衆帳號——Android乾貨分享(ID:android_share)。下面是微信的二維碼,爲你提供及時高質的Android乾貨。技術交流QQ羣:318588906,歡迎你們加羣,共同探討下Android和Java技術,一塊兒壯大咱們的微信乾貨分享社區。

相關文章
相關標籤/搜索