16_Avtivity 和 Fragment 組合使用的一些問題

1.getActivity() 引用問題

使用中听盖,經常會在 Fragment 中通過 getActivity() 獲取到宿主 Activity 對象亥鬓,但稍有不慎便會引發(fā)下面這兩個問題:

第一個运提, Activity 的實例銷毀問題。比如霞玄,Fragment 中存在類似網絡請求之類的異步耗時任務窜司,當該任務執(zhí)行完畢回調 Fragment 的方法并用到宿主 Activity 對象時,很有可能宿主 Activity 對象已經銷毀蹲坷,從而引發(fā) NullPointException 等異常驶乾,甚至造成程序崩潰。

所以循签,異步回調時需要注意添加空值等判斷(譬如:fragment.isAdd()级乐,getActivity()!=null 等),或者在 Fragment 創(chuàng)建實例時就通過 getActivity().getApplicationContext() 方法保存整個應用的上下文對象县匠,再來使用风科;

第二個,內存泄漏問題乞旦。如果 Fragment 持有宿主 Activity 的引用丐重,會導致宿主 Activity 無法回收,造成內存泄漏杆查。所以扮惦,如果可以的話,盡量不要在 Fragment 中持有宿主 Activity 的引用亲桦。

為了解決 Context 上下文引用的問題崖蜜,Fragment 提供了一個 onAttach(context) 方法,在此方法中我們可以獲取到 Context 對象客峭,如下

@Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
    }

2.onActivityResult(int requestCode, int resultCode, Intent intent)

requestCode:請求碼(指出該方法是從哪個請求的結果觸發(fā)的)
resultCode:Activity返回的結果碼(指出返回的數據來自于哪個新的Activity)

Fragment 類提供有 startActivityForResult() 方法用于 Activity 間的頁面跳轉和數據回傳豫领,其實內部也是調用 Activity 的對應方法。但是在頁面返回時需要注意 Fragment 沒有提供 setResult() 方法(設置返回處理結果)舔琅,可以通過宿主 Activity 實現等恐。

舉個例子,在 ActivityA 中的 FragmentA 里面調用 startActivityForResult() 跳轉至 ActivityB 中备蚓,并在 ActivityB 中的 FragmentB 里面返回到 ActivityA

// FragmentA 中頁面跳轉和數據回傳
...
Intent intent = new Intent(getContext(), ActivityB.class);
getActivity().startActivityForResult(intent, 0);
// FragmentB 里面返回到 ActivityA
Intent intent = new Intent(getActivity(), ActivityA.class);
intent.putExtra("test", test);
getActivity().setResult(0, intent);
getActivity().finish();

在回調時课蔬,先會回調 ActivityA 中的 onActivityResult() 方法,然后再分發(fā)回調 FragmentA 中的 onActivityResult() 方法郊尝。

// 回調 ActivityA 中的 onActivityResult() 方法
   @Override   
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {   
        // 處理特定的結果   
        if (requestCode == 0 && resultCode == 0) {   
            // 取出Intent里的Extras數據   
            Bundle data = intent.getExtras();   
            // 取出Bundle中的數據   
            String result = data.getString("test");   
            Toast.makeText(getApplicationContext(), result, 0).show();   
        }   
    }   
}

...
// 回調 FragmentA 中的 onActivityResult() 方法
...

3.getChildFragmentManager()

Activity:getFragmentManager()

在 Activity 嵌入 Fragment 時二跋,需要使用 FragmentManager,通過 Activity 提供的 getSupportFragmentManager() 方法即可獲取流昏,用于管理 Activity 里面嵌入的所有一級 Fragment扎即。

Fragment:getChildFragmentManager()

但是對于繼續(xù)嵌套二級甚至三級 Fragment吞获,即 Activity 嵌套多級 Fragment。此時在 Fragment 里管理子 Fragment 時谚鄙,也需要使用到 FragmentManager各拷。但是一定要使用 getChildFragmentManager() 方法獲取 FragmentManager 對象。

4.Fragment + ViewPager

ViewPager 提供了兩種頁面適配器來管理不同 Fragment 之間的滑動切換:FragmentPagerAdapterFragmentStatePagerAdapter闷营。

使用 FragmentPagerAdapter 時烤黍,ViewPager 中的所有 Fragment 實例常駐內存,當 Fragment 變得不可見時僅僅是視圖結構的銷毀粮坞,即調用了 onDestroyView() 方法蚊荣。由于 FragmentPagerAdapter 內存消耗較大,所以適合少量靜態(tài)頁面的場景莫杈。

使用 FragmentStatePagerAdapter 時互例,當 Fragment 變得不可見,不僅視圖層次銷毀筝闹,實例也被銷毀媳叨,即調用了 onDestroyView() 和 onDestroy() 方法,僅僅保存 Fragment 狀態(tài)关顷。相比而言糊秆, FragmentStatePagerAdapter 內存占用較小,所以適合大量動態(tài)頁面议双,比如我們常見的新聞列表類應用痘番。

參考文章
Android Fragment 的使用,一些你不可不知的注意事項

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末平痰,一起剝皮案震驚了整個濱河市汞舱,隨后出現的幾起案子,更是在濱河造成了極大的恐慌宗雇,老刑警劉巖昂芜,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異赔蒲,居然都是意外死亡泌神,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門舞虱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欢际,“玉大人,你說我怎么就攤上這事砾嫉∮卓粒” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵焕刮,是天一觀的道長舶沿。 經常有香客問我,道長配并,這世上最難降的妖魔是什么括荡? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮溉旋,結果婚禮上畸冲,老公的妹妹穿的比我還像新娘。我一直安慰自己观腊,他們只是感情好邑闲,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梧油,像睡著了一般苫耸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儡陨,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天褪子,我揣著相機與錄音,去河邊找鬼骗村。 笑死嫌褪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的胚股。 我是一名探鬼主播笼痛,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琅拌!你這毒婦竟也來了缨伊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤财忽,失蹤者是張志新(化名)和其女友劉穎倘核,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體即彪,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡紧唱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了隶校。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漏益。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖深胳,靈堂內的尸體忽然破棺而出绰疤,到底是詐尸還是另有隱情,我是刑警寧澤舞终,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布轻庆,位于F島的核電站癣猾,受9級特大地震影響,放射性物質發(fā)生泄漏余爆。R本人自食惡果不足惜纷宇,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛾方。 院中可真熱鬧像捶,春花似錦、人聲如沸桩砰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亚隅。三九已至硼莽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枢步,已是汗流浹背沉删。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留醉途,地道東北人矾瑰。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像隘擎,于是被迫代替她去往敵國和親殴穴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容