API 29 / AndroidX FragmentManager.isDestroyed() crash
btraas opened this issue · comments
Hello,
I'm getting a crash on API 29 when the androidx fragment is destroyed by android.
This SO question suggests removing the deallocation via reflection in CaldroidFragment.onDetach:
Removing the onDetach() method fixes the crash for me. Should maybe check if API < 29 before deallocating via reflection?
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManager.isDestroyed()' on a null object reference
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4687)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4705)
at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:39)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6986)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManager.isDestroyed()' on a null object reference
at androidx.fragment.app.Fragment.performDetach(Fragment.java:2944)
at androidx.fragment.app.FragmentStateManager.detach(FragmentStateManager.java:469)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1331)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1398)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1476)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1541)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2858)
at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2843)
at androidx.fragment.app.FragmentController.dispatchDestroy(FragmentController.java:330)
at androidx.fragment.app.FragmentActivity.onDestroy(FragmentActivity.java:365)
at androidx.appcompat.app.AppCompatActivity.onDestroy(AppCompatActivity.java:233)
at android.app.Activity.performDestroy(Activity.java:7680)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1306)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4672)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4705)
at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:39)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6986)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
Facing same error suddenly.
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()' on a null object reference at androidx.fragment.app.Fragment.performDetach(Fragment.java:2849) at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1034) at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238) at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303) at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2659) at androidx.fragment.app.FragmentManagerImpl.dispatchDestroy(FragmentManagerImpl.java:2644) at androidx.fragment.app.FragmentController.dispatchDestroy(FragmentController.java:329) at androidx.fragment.app.FragmentActivity.onDestroy(FragmentActivity.java:366) at androidx.appcompat.app.AppCompatActivity.onDestroy(AppCompatActivity.java:210) at android.app.Activity.performDestroy(Activity.java:7218) at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1249) at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4370) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4401) at android.app.ActivityThread.-wrap5(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1649) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Facing same error after updating to androidx.appcompat:appcompat:1.1.0.
If I leave androidx.appcompat:appcompat:1.0.2 it works.
The problem seems to be what @btraas said.
Guys, here is the solution for the issue being face.
CaldroidX
You can get solution from here
https://github.com/vpotvin/CaldroidX
No need to implement new SDK. Just remove onDetach() method from CaldroidFragment.java, if you have already moved code to androidx. That's it.
Check stackoverflow answer:- https://stackoverflow.com/a/56925799/2598244