簡體   English   中英

Android:片段堆棧和破壞的活動在onResume之后導致空指針異常

[英]Android: Fragment stack and destroyed activity causing null pointer exception after onResume

我有一個包含2個片段和1個內部片段或嵌套片段的活動。

活動和片段的創建流程:

活動->片段1->片段2 +嵌套片段

  • 創建活動時將片段1添加到布局
  • 當按鈕被從片段1壓,創建片段2。
  • 片段1替換為片段2
  • 創建片段2后 ,會自動將嵌套片段(SupportMapFragment)添加到片段2中

我正在嘗試模擬: android殺死已暫停的活動 (如果系統需要,例如系統沒有剩余的內存,則android系統可以殺死已暫停的活動)。

我該怎么做? 我按下主頁按鈕,然后從DDMS(eclipse)中按下STOP方法。 在此之后,我將從android設備菜單重新啟動該應用程序。

  • 注意1:我在片段2 +支持地圖片段中
  • 注意2:SupportMapFragment通過getChildFragmentManager()附加到父片段(片段2 getChildFragmentManager()

如果執行此操作(按“主頁”按鈕,然后從DDMS中銷毀了該應用程序),我將不斷收到此異常:

08-15 06:11:14.127: E/AndroidRuntime(3205): FATAL EXCEPTION: main
08-15 06:11:14.127: E/AndroidRuntime(3205): Process: com.zbarcea.forks, PID: 3205
08-15 06:11:14.127: E/AndroidRuntime(3205): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.zbarcea.forks/com.zbarcea.forks.activities.ActivityMain}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.zbarcea.forks.fragments.FragmentMapMode$4: make sure class name exists, is public, and has an empty constructor that is public
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.os.Looper.loop(Looper.java:136)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at java.lang.reflect.Method.invokeNative(Native Method)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at java.lang.reflect.Method.invoke(Method.java:515)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at dalvik.system.NativeStart.main(Native Method)
08-15 06:11:14.127: E/AndroidRuntime(3205): Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.zbarcea.forks.fragments.FragmentMapMode$4: make sure class name exists, is public, and has an empty constructor that is public
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.Fragment.instantiate(Fragment.java:413)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1790)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.Fragment.performCreate(Fragment.java:1489)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1879)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:215)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at com.zbarcea.forks.activities.BaseSlidingMenuFragmentActivity.onCreate(BaseSlidingMenuFragmentActivity.java:93)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at com.zbarcea.forks.activities.ActivityMain.onCreate(ActivityMain.java:205)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.app.Activity.performCreate(Activity.java:5231)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
08-15 06:11:14.127: E/AndroidRuntime(3205):     ... 11 more
08-15 06:11:14.127: E/AndroidRuntime(3205): Caused by: java.lang.InstantiationException: can't instantiate class com.zbarcea.forks.fragments.FragmentMapMode$4; no empty constructor
08-15 06:11:14.127: E/AndroidRuntime(3205):     at java.lang.Class.newInstanceImpl(Native Method)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at java.lang.Class.newInstance(Class.java:1208)
08-15 06:11:14.127: E/AndroidRuntime(3205):     at android.support.v4.app.Fragment.instantiate(Fragment.java:402)
08-15 06:11:14.127: E/AndroidRuntime(3205):     ... 24 more

因此,每次父片段( 片段2 )調用onPause().時,我都試圖刪除SupportMapFragment onPause().

    @Override
    public void onPause()
    {
        super.onPause();

        infoWindowAdapterMapMode = null;

        getChildFragmentManager().beginTransaction().remove(supportMapFragment).commit();

        supportMapFragment = null;
    }

問題解決了! 如果我銷毀了該活動並且正在恢復該應用程序,則會重新創建該片段,也不例外!

在創建支持映射片段之前,我過快按下主頁按鈕(不是從DDMS調用STOP)時,就會出現問題。

我收到此異常:

08-15 06:24:50.679: E/AndroidRuntime(3275): FATAL EXCEPTION: main
08-15 06:24:50.679: E/AndroidRuntime(3275): Process: com.zbarcea.forks, PID: 3275
08-15 06:24:50.679: E/AndroidRuntime(3275): java.lang.NullPointerException
08-15 06:24:50.679: E/AndroidRuntime(3275):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:651)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at android.os.Handler.handleCallback(Handler.java:733)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at android.os.Handler.dispatchMessage(Handler.java:95)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at android.os.Looper.loop(Looper.java:136)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at java.lang.reflect.Method.invokeNative(Native Method)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at java.lang.reflect.Method.invoke(Method.java:515)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-15 06:24:50.679: E/AndroidRuntime(3275):     at dalvik.system.NativeStart.main(Native Method)

就是這樣。 我無法確定異常的來源,因為它在支持庫中的某個地方崩潰了。

第一:我喜歡您專注於對應用程序進行干凈且正確的狀態處理的方法。 但是,正如您所說:Android可以終止活動並自行管理其生命周期。 操作系統可能會盡快釋放為您的活動分配的內存,要求您再次分配它。 這意味着您的碎片可能會也可能不會被銷毀。 正如您在堆棧跟蹤中看到的那樣,將調用FragmentActivity.onCreate。 這顯然表明您無法在舊活動的上下文中創建的現有資源被訪問。 在整個應用程序生命周期中保證存在的唯一上下文是應用程序上下文。 對於所有其他資源,您應該了解並正確處理在嘗試訪問它們時創建的資源可能無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM