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(仍然抛出相同的错误)
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;
}