roomorama / Caldroid

A better calendar for Android
Other
1.42k stars 532 forks source link

API 29 / AndroidX FragmentManager.isDestroyed() crash #485

Open btraas opened 4 years ago

btraas commented 4 years ago

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:

https://stackoverflow.com/questions/56925777/boolean-androidx-fragment-app-fragmentmanagerimpl-isdestroyed-on-a-null-obje

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) 
JChudasama commented 4 years ago

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) 

KimPark89 commented 4 years ago

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.

JChudasama commented 4 years ago

Guys, here is the solution for the issue being face. CaldroidX

pavelsust commented 4 years ago

You can get solution from here https://github.com/vpotvin/CaldroidX

jmimohsin commented 2 years ago

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