Search code examples
javaandroidkotlinserializationioexception

Caused by: java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object


I have an activity and a presenter that doesn't have a default constructor, injected with koin:

class HomeActivityPresenter<V : HomeActivityNav>(dataManager: DataManager, schedulerProvider: SchedulerProvider) :
        BaseViewModel<V>(dataManager, schedulerProvider) HomeActivityListener, Serializable { 

In activity I inflate a fragment with addFragment method:

fun AppCompatActivity.addFragment(fragment: Fragment, frameId: Int) {
    supportFragmentManager.inTransaction { add(frameId, fragment) }
}

I am testing my app with Don't keep activities. While the activity is open, I press the home button to put my app in background. When the activity is restored I got this crash:

java.lang.RuntimeException: Unable to start activity ComponentInfopackagename.ui.features.home.activity.HomeActivity}: java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object (name = packagename.ui.features.home.activity.HomeActivityPresenter)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    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.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object (name = packagename.ui.features.home.activity.HomeActivityPresenter)
    at android.os.Parcel.readSerializable(Parcel.java:3136)
    at android.os.Parcel.readValue(Parcel.java:2917)
    at android.os.Parcel.readArrayMapInternal(Parcel.java:3244)
    at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
    at android.os.BaseBundle.unparcel(BaseBundle.java:236)
    at android.os.BaseBundle.getString(BaseBundle.java:1160)
    at android.os.BaseBundle.getString(BaseBundle.java:1182)
    at packagename.ui.features.orderstatus.PickupOrderStatusDetailFragment.onCreate(PickupOrderStatusDetailFragment.kt:49)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2586)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:838)
    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.dispatchCreate(FragmentManagerImpl.java:2607)
    at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:235)
    at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:316)
    at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:106)
    at packagename.features.home.activity.HomeActivity.onCreate(HomeActivity.kt:84)
    at android.app.Activity.performCreate(Activity.java:7802)
    at android.app.Activity.performCreate(Activity.java:7791)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    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.io.InvalidClassException: packagename.ui.features.home.activity.HomeActivityPresenter; no valid constructor
    at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:154)
    at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:798)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1873)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1412)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
    at android.os.Parcel.readSerializable(Parcel.java:3134)
    at android.os.Parcel.readValue(Parcel.java:2917) 
    at android.os.Parcel.readArrayMapInternal(Parcel.java:3244) 
    at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292) 
    at android.os.BaseBundle.unparcel(BaseBundle.java:236) 
    at android.os.BaseBundle.getString(BaseBundle.java:1160) 
    at android.os.BaseBundle.getString(BaseBundle.java:1182) 
    at packagename.ui.features.orderstatus.PickupOrderStatusDetailFragment.onCreate(PickupOrderStatusDetailFragment.kt:49) 
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2586) 
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:838) 
    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.dispatchCreate(FragmentManagerImpl.java:2607) 
    at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:235) 
    at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:316) 
    at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:106) 
    at packagename.ui.features.home.activity.HomeActivity.onCreate(HomeActivity.kt:84) 
    at android.app.Activity.performCreate(Activity.java:7802) 
    at android.app.Activity.performCreate(Activity.java:7791) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    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) 

This is the line 49 on my fragment that my crash points to:

   val orderStatus = args.getString(Constants.pickUpOrderCreate, "")

I don't know how to fix this.


Solution

  • BTW: Why do you need to serialise the view model. What are you trying to achieve. When the activity is destroyed due to any reason other than configuration change, view models do not help you in any way. They will just survive config changes.