Android開發Fragment的陷阱

樹數wwb 8年前發布 | 8K 次閱讀 Android開發 移動開發

來自: http://www.jcodecraeer.com//a/anzhuokaifa/androidkaifa/2014/0729/1635.html


以前做過的一個項目,Fragment嵌套高德地圖,當再次進入Fragment的時候,會出現奇怪的現象。嵌套的地圖會出現滑動不動的情況,起先還以為是高德的bug呢,經過一番研究,終確定這是一個坑。

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

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

但是需要注意的一點就是,如果重用rootView的話,一定要記得在onDestroyView里面把rootView先給移除掉,因為已經有過父布局的View是不能再次添加到另一個新的父布局上面的。代碼如下

這樣也就解決了最前面我遇到的那個bug,由于每次進入都會創建一個MapView,很多地圖疊在了一起,所以就出現了"滑不動"的奇怪現象。

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


 本文由用戶 樹數wwb 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!