2013-03-05 55 views
7

今天我在應用程序中發現了一個奇怪的行爲。片段的onActivityCreated()在Activity的onDestroy()後調用

它發生在我使用Eclipse的Devices視圖停止應用程序時。有人可以解釋嗎?

爲什麼onActivityCreated()Fragment即使在Activity已被銷燬時也會被調用? MyHomeActivity包含兩個Fragment s,併爲兩者生成類似的日誌。

在這裏,我粘貼日誌爲一個FragmentNullPointerException是次要問題。

我很驚訝爲什麼onActivityCreated()被調用時調用堆棧從onDestroy()MyHomeActivity啓動?

03-05 12:31:21.414: W/System.err(5638): java.lang.NullPointerException 
03-05 12:31:21.421: W/System.err(5638):  at **MyListViewFrag.onActivityCreated**(BuddyListViewFrag.java:85) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(FragmentManager.java:1888) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentActivity.onReallyStop(FragmentActivity.java:787) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentActivity.doReallyStop(FragmentActivity.java:764) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:322) 
03-05 12:31:21.421: W/System.err(5638):  at MyFragmentActivity.onDestroy(RbrFragmentActivity.java:57) 
03-05 12:31:21.421: W/System.err(5638):  at **MyHomeActivity.onDestroy**(MyHomeActivity.java:254) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2663) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2694) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread.access$2100(ActivityThread.java:117) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968) 
03-05 12:31:21.421: W/System.err(5638):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-05 12:31:21.421: W/System.err(5638):  at android.os.Looper.loop(Looper.java:130) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
03-05 12:31:21.429: W/System.err(5638):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-05 12:31:21.429: W/System.err(5638):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-05 12:31:21.429: W/System.err(5638):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
03-05 12:31:21.429: W/System.err(5638):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
03-05 12:31:21.429: W/System.err(5638):  at dalvik.system.NativeStart.main(Native Method) 

我使用支持庫提供Fragment s到預蜂窩設備,如果讓任何區別。

+0

你似乎重寫'onDestroy'回調。你在那做什麼? – Luksprog 2013-03-05 07:39:28

+0

沒有什麼只是調用super.OnDestroy() – aProgrammer 2013-03-05 12:25:24

+0

我只注意到我的4.2模擬器上的相同行爲。你有沒有找到更多信息? – 2013-04-08 18:41:16

回答

14

經過一些測試和審查FragmentManager.moveToState,我相信當Fragment正在由FragmentPagerAdapter處理,這是不可避免的這是以前合併成savedState(如停止應用程序的過程的一部分Fragment你殺的前從eclipse中的DDMS選項卡處理)必須先被「創建」(在術語FragmentManager中),然後才能被銷燬。

這可能實際上是從保存狀態重建碎片的過程的意外結果。當FragmentActivity正在執行onCreatefinish()被調用時,意圖是FragmentActivity停止設置並退出。視覺體驗是這種情況發生,但它似乎像FragmentManager自己一樣繼續生命週期的先前存在Fragment s,albiet與一些捷徑。這個過程似乎執行到onActivityCreated的生命週期方法,然後執行onDestroyonDetach,跳過它們之間的那些。

處理此問題的最佳方法似乎是解決由此啓動引起的次要問題(在這種情況下,您的NPE)。看起來在Fragment生命週期中可以優化這個空間,但是在r12支持庫中,情況似乎是設計的結果。

+0

我也注意到完全相同的行爲。不過,我正在等待可以將所有觀點放在一起的答案。非常感謝這對其他人很有幫助,是的,我已經解決了NPE並解決了這個奇怪的問題。這絕對不是Android傢伙預計的... – aProgrammer 2013-04-10 06:32:58

+0

謝謝你的解釋。幾年後,不幸的是,這種邏輯似乎仍然是一樣的。 – 2017-06-02 09:42:05

相關問題