android.app.FragmentManagerImpl.execPendingActions에서 NPE가 떨어지는 경우..

android.app.FragmentManagerImpl.execPendingActions에서 java.lang.NullPointerException(NPE)가 떨어지는 제 경우를 살펴보니, Activity에서 많은 Fragment가 replace되고 있는 상황이다. 이 문제에 대해서, 아래를 확인해 보면 도움을 받을 수 있다.
– http://stackoverflow.com/questions/14810183/fragmentmanager-nullpointerexception-when-trying-to-commitallowingstateloss
– http://stackoverflow.com/questions/10456077/nullpointerexception-in-fragmentmanager

아래는 android.app.Activity를 상속받은 Activity 클래스에서 앱이 종료되면서, 프레임웍에서 발생시키는 크래시이다. 이것만으로는 디버깅하기 졸라 어렵다.

11-06 14:24:55.582: E/AndroidRuntime(6925): FATAL EXCEPTION: main
11-06 14:24:55.582: E/AndroidRuntime(6925): java.lang.NullPointerException
11-06 14:24:55.582: E/AndroidRuntime(6925): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1357)
11-06 14:24:55.582: E/AndroidRuntime(6925): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
11-06 14:24:55.582: E/AndroidRuntime(6925): at android.os.Handler.handleCallback(Handler.java:605)
11-06 14:24:55.582: E/AndroidRuntime(6925): at android.os.Handler.dispatchMessage(Handler.java:92)
11-06 14:24:55.582: E/AndroidRuntime(6925): at android.os.Looper.loop(Looper.java:137)
11-06 14:24:55.582: E/AndroidRuntime(6925): at android.app.ActivityThread.main(ActivityThread.java:4424)
11-06 14:24:55.582: E/AndroidRuntime(6925): at java.lang.reflect.Method.invokeNative(Native Method)
11-06 14:24:55.582: E/AndroidRuntime(6925): at java.lang.reflect.Method.invoke(Method.java:511)
11-06 14:24:55.582: E/AndroidRuntime(6925): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-06 14:24:55.582: E/AndroidRuntime(6925): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-06 14:24:55.582: E/AndroidRuntime(6925): at dalvik.system.NativeStart.main(Native Method)

그래서, Activity를 최신버전(4.4)의 support 라이브러리에 있는 FragmentActivity로 바꿔서 돌려보니, 디버깅할 수 있는 콜 스택을 보여준다.. 헐.. 그래서, 내 경우에는 Fragment 클래스에서 replace하는 메서드에 아래의 코드를 추가해서 해결했다.

if(activity() == null || activity().isFinishing())
return;

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.