国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Fragment銷毀時replace和add兩個方法的區別

2019-11-06 09:44:35
字體:
來源:轉載
供稿:網友

這個首先從一個bug說起,如圖:

 

我們都知道fragment切換有兩種方式:

1. replace方式

transaction.replace(R.id.content, IndexFragment);

2. add-hide-show方式

transaction.add(R.id.content, IndexFragment);  transaction.hide(otherfragment);  transaction.show(thisfragment);

而上面按鈕中出現bug的就是采用第二種方式。然后我們來分析下用add,hide,show為什么出現這種bug,我把每個操作都打印出了以下日志:

復現bug的操作是:1.首先打開,默認選中的是第一個tab,如上面的一張圖片正常那樣。2.切換到tab2,并把tab1 hide掉;3.再切回到tab1,并不會觸發tab1對應fragment的任何生命周期;4.然后home鍵進入后臺,我在activity的onPause()中手動對IndexFragment賦空,模擬長時間后臺,系統銷毀了該引用。

IndexFragment=null;

5.再次啟動,其實tab1 的fragment實例在內存中還在,只是他的引用被銷毀了。6.再切到tab2,這里其實是先把tab1的hide,在show tab2,但是tab1 的fragment引用為空,所以無法hide,就出現了tab2疊在tab1上的花屏情況。7.再切到tab1,tab1就會重復創建對象。

同樣的操作,我們使用replace的方式

使用replace方式,雖然這種方式會避免上述的bug,但也是重復創建了對象。因為replace方式,對應的FrameLayout只有一 層,而add方式,這個FrameLayout其實有2層。但是這種方式的缺點是:每次replace會把生命周期全部執行一遍,如果在這些生命周期函數 里拉取數據的話,就會不斷重復的加載刷新數據。

那么最合適的處理方式是這樣的:

1.在add的時候,加上一個tab參數transaction.add(R.id.content, IndexFragment,”Tab1″);2.然后當IndexFragment引用被回收置空的話,先通過IndexFragment=FragmentManager.findFragmentByTag(“Tab1″);找到對應的引用,然后繼續上面的hide,show;


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 抚顺市| 北海市| 长宁区| 抚远县| 长治市| 云阳县| 天峨县| 林芝县| 鄂伦春自治旗| 广昌县| 临高县| 四川省| 福贡县| 集贤县| 余庆县| 信宜市| 南召县| 永济市| 中卫市| 社会| 县级市| 宁津县| 彭阳县| 深水埗区| 茶陵县| 大埔区| 长丰县| 凤庆县| 蒲江县| 桐柏县| 繁昌县| 时尚| 应城市| 东方市| 大余县| 北京市| 霍邱县| 尚志市| 吉水县| 尚义县| 唐海县|