Java Parcelable在活动暂停时写入可序列化对象时遇到IOException

Java Parcelable在活动暂停时写入可序列化对象时遇到IOException,java,android,android-fragments,serialization,Java,Android,Android Fragments,Serialization,我在GridView适配器中编写了一个侦听器接口,用于获取所选图像的图像路径。它说,MainActivity正在抛出NotSerializableException。使活动可以序列化不是一个好的做法。在创建片段实例时,我将侦听器传递给a包。它工作正常,但每当活动进入暂停状态时就会崩溃。(当我点击菜单(或)主页按钮时) 错误日志: 11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime: FATAL EXCEPTION: m

我在
GridView
适配器中编写了一个侦听器接口,用于获取所选图像的图像路径。它说,
MainActivity
正在抛出
NotSerializableException
。使活动可以序列化不是一个好的做法。在创建片段实例时,我将侦听器传递给a包。它工作正常,但每当活动进入暂停状态时就会崩溃。(当我点击菜单(或)主页按钮时)

错误日志:

    11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime: FATAL EXCEPTION: main
  11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime: Process: PACKAGE_NAME, PID: 16903
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = PACKAGE_NAME.activities.MainActivity$StickerSelectListener)
  11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeSerializable(Parcel.java:1388)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeValue(Parcel.java:1335)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Bundle.writeToParcel(Bundle.java:1096)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeBundle(Parcel.java:663)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:137)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeTypedArray(Parcel.java:1191)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:385)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeParcelable(Parcel.java:1357)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeValue(Parcel.java:1262)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Bundle.writeToParcel(Bundle.java:1096)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeBundle(Parcel.java:663)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2914)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3276)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5238)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:  Caused by: java.io.NotSerializableException: PACKAGE_NAME.activities.MainActivity
  11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeSerializable(Parcel.java:1383)
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeValue(Parcel.java:1335) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeArrayMapInternal(Parcel.java:638) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Bundle.writeToParcel(Bundle.java:1096) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeBundle(Parcel.java:663) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:137) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeTypedArray(Parcel.java:1191) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:385) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeParcelable(Parcel.java:1357) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeValue(Parcel.java:1262) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeArrayMapInternal(Parcel.java:638) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Bundle.writeToParcel(Bundle.java:1096) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Parcel.writeBundle(Parcel.java:663) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2914) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3276) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5238) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931) 
      11-03 12:37:34.556 16903-16903/PACKAGE_NAME E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726)
GridView适配器内的KeyClickListener接口

public interface KeyClickListener {
    void keyClicked(String path);
}
这是MainActivity中实现KeyClickListener接口的侦听器类

private class StickerSelectListener implements StickerGridAdapter.KeyClickListener, Serializable {
    @Override public void keyClicked(String path) {
      try {
        InputStream inputStream = assetManager.open(Utils.getStickerPathFromThumbail(path));
        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
        stickerImage.setImageBitmap(bitmap);
        inputStream.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
这就是我将侦听器传递给片段的方式(在Tab Select listener中,1是所选选项卡索引的位置)

这就是我创建Fragment实例的方式

 public static StickerSelectionFragment getInstance(
      StickerGridAdapter.KeyClickListener mKeyClickListener) {

    if (mKeyClickListener == null) L.e("NULLALALALLA");
    if (mFragment == null) {
      mFragment = new StickerSelectionFragment();
      Bundle args = new Bundle();
      args.putSerializable(KEY, (Serializable) mKeyClickListener);
      mFragment.setArguments(args);
    }
    if (mFragment.getArguments() == null) L.e("NULLELELELELE");
    return mFragment;
  }
我为解决这个问题所做的: -即使在MainActivity实现了Serializable类之后,它仍然抛出相同的错误

  • 使侦听器成为另一个新类,并传递ImageView和AssetManager(仍然抛出相同的错误)

你解决了这个问题吗?@Simon我还是解决不了
 public static StickerSelectionFragment getInstance(
      StickerGridAdapter.KeyClickListener mKeyClickListener) {

    if (mKeyClickListener == null) L.e("NULLALALALLA");
    if (mFragment == null) {
      mFragment = new StickerSelectionFragment();
      Bundle args = new Bundle();
      args.putSerializable(KEY, (Serializable) mKeyClickListener);
      mFragment.setArguments(args);
    }
    if (mFragment.getArguments() == null) L.e("NULLELELELELE");
    return mFragment;
  }