18

我有一個FragmentActivity(Support Fragments),我通過代碼創建了Fragments並將它們放入FrameLayouts中。到目前爲止,這一切都很好。 現在,如果我離開應用程序返回一切都很好,只要系統不殺死我的活動(或者我用DDMS中的停止按鈕)。如果這沒有發生,那麼我們的活動就會被殺死。 onDestroy不被調用。活動get死後重新創建片段

因此,當我重新打開我的應用程序時,所有的碎片仍然存在,我得到NullPointerExeptions,因爲他們試圖做他們的工作。碎片不應該存在於這個應用程序的狀態,所以這對我來說是個問題。

我不需要它們在backStack,所以我不把它們放在那裏,不能調用popBackStack()來擺脫它們。

如何重置我的FragmentManager onCreate()或只是確保片段也被破壞?

+0

您是否找到了解決方案? – Henry

回答

0

不知道它是否是同一個問題,但前一段時間,我在viewpager中遇到了片段問題,其中片段生命週期方法從未被調用,問題出在片段管理器上。

因此,請嘗試使用childFragmentManager而不是supportFragmentManager並查看它是否修復了您的問題。

+0

如果你的Activity被殺死,onDestroy被調用。我相當肯定,當你的活動被殺死時,碎片就會隨之而來。是什麼讓你認爲你的活動會被殺?你確定沒有什麼能夠保持對你的碎片的引用嗎? – Christine

+0

問題是,onDestroy沒有被確認。但是當onCreate被調用時,我知道它已經被銷燬了。我所有的引用都在被破壞的活動中,所以不是。 – Towlie288

+0

你絕對不能依靠onDestroy()來調用,並且有可能的副作用,比如管理繼續完成onDestroy()。它可以是一個混亂 –

2

這實際上可能是正常的。 Android並沒有實例化並銷燬大量碎片,而是可能會讓它們保持在周圍。這特別發生在ViewPagers上。

您是否使用了很多getActivity()調用或調用獲取上下文?如果是這樣,null通過做一些簡單的事情來檢查getActivity()調用

Activity activity = getActivity(); 
if (activity == null) 
{ 
    Log.w("activity null!", "This will cause a crash if you access this variable!"); 
} 

另一個提示是注意AsyncTasks。如果你有任何這些在後臺運行,你會想要跟蹤活動是否存活。我認爲生命週期檢查會放到Android的更高版本中,但是您也可以在onAttach()和onDetach()上保留一個布爾標誌。

3

該片段的lifecycle與該活動的生命週期相似,因此它可以被系統殺死並重新創建,以節省其他應用的內存。這意味着有一種保存和恢復片段狀態的機制。你應該使用它。

如果這是不可能保存片段的狀態(由於其數據是動態的和不可序列化的),嘗試實現一些非初始化狀態的默認行爲。

3

我知道這是真的晚了,但我有同樣的問題,我找到了答案,在這裏

support FragmentPagerAdapter holds reference to old fragments

這裏

ViewPager and fragments — what's the right way to store fragment's state?

我猜測,問題是,當您創建您創建的活動並將片段保存在某個列表中,而不是保存在片段menager中。當再次創建活動時,它也創建一個片段,但片段管理器使用之前創建的片段。這就是你的片段爲getActivity()返回null的原因,因爲這個片段是在將應用程序放入後臺之前創建的。

+2

請注意,[鏈接只有答案](http://meta.stackoverflow.com/tags/link-only-answers/info)不鼓勵,所以答案應該是搜索的終點一個解決方案(相對於另一個引用的中途停留,它隨着時間的推移會變得陳舊)。請考慮在此添加獨立的摘要,並將鏈接保留爲參考。 – kleopatra

+1

這些鏈接真的很詳細地解釋。很好的答案。 – Smeet

相關問題