0

I have this interface:

interface MyListener : Serializable {
    fun onClick()
}

In my Fragment I have a lazy instance of it which I attach it to the fragment's arguments. Something like:

class MyFragment: Fragment() {


  private val listener: MyListener by lazy {
      object : MyListener {
          override fun onClick() {
            // Do something
          }

      }
  }


  fun testFun1() {
      arguments = bundleOf(
          "listener" to listener
      )
  }

  fun onAcceptClick() {
    val listener = arguments?.getSerializable("listener")
  }
    

}

Everything works fine, until the moment when I press home button, or recents button and the app throughs this exception:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test.me, PID: 8501
    java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.test.me.MyFragment$listener$2$1)
        at android.os.Parcel.writeSerializable(Parcel.java:1833)
        at android.os.Parcel.writeValue(Parcel.java:1780)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:928)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1584)
        at android.os.Bundle.writeToParcel(Bundle.java:1253)
        at android.os.Parcel.writeBundle(Parcel.java:997)
        at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:159)
        at android.os.Parcel.writeTypedObject(Parcel.java:1634)
        at android.os.Parcel.writeTypedList(Parcel.java:1513)
        at android.os.Parcel.writeTypedList(Parcel.java:1470)
        at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:64)
        at android.os.Parcel.writeParcelable(Parcel.java:1801)
        at android.os.Parcel.writeValue(Parcel.java:1707)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:928)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1584)
        at android.os.Bundle.writeToParcel(Bundle.java:1253)
        at android.os.Parcel.writeBundle(Parcel.java:997)
        at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:161)
        at android.os.Parcel.writeTypedObject(Parcel.java:1634)
        at android.os.Parcel.writeTypedList(Parcel.java:1513)
        at android.os.Parcel.writeTypedList(Parcel.java:1470)
        at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:64)
        at android.os.Parcel.writeParcelable(Parcel.java:1801)
        at android.os.Parcel.writeValue(Parcel.java:1707)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:928)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1584)
        at android.os.Bundle.writeToParcel(Bundle.java:1253)
        at android.os.Parcel.writeBundle(Parcel.java:997)
        at android.os.Parcel.writeValue(Parcel.java:1698)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:928)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1584)
        at android.os.Bundle.writeToParcel(Bundle.java:1253)
        at android.os.Parcel.writeBundle(Parcel.java:997)
        at android.os.Parcel.writeValue(Parcel.java:1698)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:928)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1584)
        at android.os.Bundle.writeToParcel(Bundle.java:1253)
        at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4505)
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        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.NotSerializableException: com.test.me.MyFragment
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
        at android.os.Parcel.writeSerializable(Parcel.java:1828)
E/AndroidRuntime:   ... 45 more

I know that I can solve the problem by using Parcelable instead of Serializable but I would like to understand why this is happening. Also, if I want to use Parcelable in combination with @Parcelize annotation then I will have to convert MyListener from an interface to a class.

So, what would be the solution or workaround here while keep using an interface?

0 Answers0