java.lang.RuntimeException: Unable to destroy activity {MainActivity}: java.util.ConcurrentModificationException

Viewed 1485

When I set my application to background and open it again I have a crash:

java.lang.RuntimeException: Unable to destroy activity {MainActivity}: java.util.ConcurrentModificationException

I'm using navigation graph scope for storing viewmodel

fun <T : ViewModel> getViewModelForGraph(
    graphId: Int,
    clazz: Class<T>,
    fragment: Fragment
): T {
    val navController = NavHostFragment.findNavController(fragment)
    val vmFactory = object : ViewModelProvider.Factory {
        override fun <U : ViewModel?> create(modelClass: Class<U>): U =
            Factory.getComponent(clazz) as U
    }
    return ViewModelProvider(
        navController.getViewModelStoreOwner(graphId),
        vmFactory
    ).get(clazz)
}

and I'm getting my viewmodel from fragment this way:

getViewModelForGraph(
        R.id.my_sub_graph,
        MyViewModel::class.java,
        this
    )

.getViewModelForGraph( R.id.mySubGraph, MyViewModel::class.java, this )

And problem resolves when I'm getViewModelForGraph and just attaching my viewmodel to the activity.

Am I using navGraph viewmodel storage in a wrong way?

full stackTrace

java.lang.RuntimeException: Unable to destroy activity {app/MainActivity}: java.util.ConcurrentModificationException
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4941)
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4970)
    at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:44)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
 Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1441)
    at java.util.HashMap$KeyIterator.next(HashMap.java:1465)
    at androidx.navigation.NavControllerViewModel.onCleared(NavControllerViewModel.java:62)
    at androidx.lifecycle.ViewModel.clear(ViewModel.java:139)
    at androidx.lifecycle.ViewModelStore.clear(ViewModelStore.java:62)
    at androidx.fragment.app.FragmentManagerViewModel.clearNonConfigState(FragmentManagerViewModel.java:160)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1026)
    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:8048)
    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1341)
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4926)
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4970) 
    at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:44) 
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7356) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
0 Answers
Related