NotSerializableException while saving fragment state

android, android-fragments

Solution

I haven't totally understood, but apparently solved the issue. The exceptions were thrown when the activity was destroyed because another one came into the foreground. I solved it by converting the anonymous IResultProcessor class into a static inner class of my activity.

Problem

I'm occasionally seeing exceptions that I do not really understand. Here's what I do: I have an interface ``` public interface IResultProcessor<T> extends Serializable { void processResult(T result); } ``` , instances of which I use in this class: ``` public class ConfirmationDialogFragment extends DialogFragment { public static void executeAfterConfirmation(FragmentActivity activity, IResultProcessor<Void> runnable, String title, String message, int icon, String positiveButtonText, String negativeButtonText) { ConfirmationDialogFragment fragment = new ConfirmationDialogFragment(); Bundle args = new Bundle(); args.putSerializable(ARG_RUNNABLE, runnable); fragment.setArguments(args); fragment.show(activity.getSupportFragmentManager(), "dialog"); } } ``` In the `onCreateDialog()` method, I receive the `IProcessResult` instance and execute it if the user has confirmed. I then use all this in an activity as follows: ``` @SuppressWarnings("serial") IResultProcessor<Void> processor = new IResultProcessor<Void>() { @Override public void processResult(Void result) { new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { DBFacade.INSTANCE.saveSession(session); return "My msg..."; } @Override protected void onPostExecute(String result) { Toast.makeText(MyActivity.this, result, Toast.LENGTH_LONG).show(); } }.execute((Void) null); } }; ConfirmationDialogFragment.executeAfterConfirmation(this, processor, "Save session?", "dialog text", R.drawable.ic_dialog_info, "Save", "Don't save"); ``` The `session` object saved in the `AsyncTask` does not implement `Serializable` (but `Parcelable` because of other reasons) and is a field of MyActivity. And here's the exception I'm seeing: ``` java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = MyActivity$3) at android.os.Parcel.writeSerializable(Parcel.java:1279) at android.os.Parcel.writeValue(Parcel.java:1233) at android.os.Parcel.writeMapInternal(Parcel.java:591) at android.os.Bundle.writeToParcel(Bundle.java:1619) at android.os.Parcel.writeBundle(Parcel.java:605) at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:132) at android.os.Parcel.writeTypedArray(Parcel.java:1102) at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:357) at android.os.Parcel.writeParcelable(Parcel.java:1254) at android.os.Parcel.writeValue(Parcel.java:1173) at android.os.Parcel.writeMapInternal(Parcel.java:591) at android.os.Bundle.writeToParcel(Bundle.java:1619) at android.os.Parcel.writeBundle(Parcel.java:605) at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2078) at android.app.ActivityThread$StopInfo.run(ActivityThread.java:2874) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.io.NotSerializableException: MyActivity at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364) at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) at android.os.Parcel.writeSerializable(Parcel.java:1274) ... 23 more java.io.NotSerializableException: MyActivity at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364) at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) at android.os.Parcel.writeSerializable(Parcel.java:1274) at android.os.Parcel.writeValue(Parcel.java:1233) at android.os.Parcel.writeMapInternal(Parcel.java:591) at android.os.Bundle.writeToParcel(Bundle.java:1619) at android.os.Parcel.writeBundle(Parcel.java:605) at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:132) at android.os.Parcel.writeTypedArray(Parcel.java:1102) at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:357) at android.os.Parcel.writeParcelable(Parcel.java:1254) at android.os.Parcel.writeValue(Parcel.java:1173) at android.os.Parcel.writeMapInternal(Parcel.java:591) at android.os.Bundle.writeToParcel(Bundle.java:1619) at android.os.Parcel.writeBundle(Parcel.java:605) at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2078) at android.app.ActivityThread$StopInfo.run(ActivityThread.java:2874) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) ``` Any idea what's going on here?

Original source