通过意图在活动之间传递自定义对象时出错
Posted
技术标签:
【中文标题】通过意图在活动之间传递自定义对象时出错【英文标题】:Error passing custom object between activities through intent 【发布时间】:2018-01-05 23:14:05 【问题描述】:我尝试通过在 CustomObject 上实现 Serializable 将这个简单的对象从 MainActivity 传递到 Main2Activity。它导致错误。我提到了类似的堆栈溢出问题。没有任何帮助。
public class MainActivity extends Activity
String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent i = new Intent(this,Main2Activity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("data",new CustomObject());
//I tried i.putExtra(bundle);
i.putExtra("data",new CustomObject());
startActivity(i);
Log.d(TAG, "onCreate: ");
public class CustomObject implements Serializable
public int i = 0;
public int j = 9;
CustomObject()
Main2Activity
public class Main2Activity extends Activity
String TAG = "Main2Activity";
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent i = getIntent();
MainActivity.CustomObject c = (MainActivity.CustomObject)i.getSerializableExtra("data");
Log.d(TAG, "onCreate: "+c.i+" "+c.j);
错误信息:
07-30 13:58:58.352 26489-26489/? E/androidRuntime:致命异常: 主要的 进程:gct.venkatesh.com.scrshtrebuilt,PID:26489 java.lang.RuntimeException:无法启动活动 组件信息gct.venkatesh.com.scrshtrebuilt/gct.venkatesh.com.scrshtrebuilt.MainActivity: java.lang.RuntimeException: Parcelable遇到IOException写 可序列化对象(名称 = gct.venkatesh.com.scrshtrebuilt.MainActivity$CustomObject) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2684) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2751) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6186) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 引起:java.lang.RuntimeException: Parcelable遇到IOException写 可序列化对象(名称 = gct.venkatesh.com.scrshtrebuilt.MainActivity$CustomObject) 在 android.os.Parcel.writeSerializable(Parcel.java:1527) 在 android.os.Parcel.writeValue(Parcel.java:1475) 在 android.os.Parcel.writeArrayMapInternal(Parcel.java:724) 在 android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1417) 在 android.os.Bundle.writeToParcel(Bundle.java:1157) 在 android.os.Parcel.writeBundle(Parcel.java:764) 在 android.content.Intent.writeToParcel(Intent.java:8703) 在 android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3082) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1520) 在 android.app.Activity.startActivityForResult(Activity.java:4229) 在 android.app.Activity.startActivityForResult(Activity.java:4187) 在 android.app.Activity.startActivity(Activity.java:4526) 在 android.app.Activity.startActivity(Activity.java:4494) 在 gct.venkatesh.com.scrshtrebuilt.MainActivity.onCreate(MainActivity.java:21) 在 android.app.Activity.performCreate(Activity.java:6684) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2637) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2751) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6186) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 引起:java.io.NotSerializableException: gct.venkatesh.com.scrshtrebuilt.MainActivity 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1224) 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 在 android.os.Parcel.writeSerializable(Parcel.java:1522) 在 android.os.Parcel.writeValue(Parcel.java:1475) 在 android.os.Parcel.writeArrayMapInternal(Parcel.java:724) 在 android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1417) 在 android.os.Bundle.writeToParcel(Bundle.java:1157) 在 android.os.Parcel.writeBundle(Parcel.java:764) 在 android.content.Intent.writeToParcel(Intent.java:8703) 在 android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3082) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1520) 在 android.app.Activity.startActivityForResult(Activity.java:4229) 在 android.app.Activity.startActivityForResult(Activity.java:4187) 在 android.app.Activity.startActivity(Activity.java:4526) 在 android.app.Activity.startActivity(Activity.java:4494) 在 gct.venkatesh.com.scrshtrebuilt.MainActivity.onCreate(MainActivity.java:21) 在 android.app.Activity.performCreate(Activity.java:6684) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2637) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2751) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6186) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
【问题讨论】:
【参考方案1】:由于日志中的此错误:
java.io.NotSerializableException: gct.venkatesh.com.scrshtrebuilt.MainActivity at
MainActivity
不是可序列化,我认为平台希望MainActivity
可序列化,因为CustomObject
是MainActivity
中的内部类,
尝试在单独的本地类(单独的文件)中定义您的 CustomObject
【讨论】:
效果很好。但我有一个疑问。当我尝试序列化自定义对象并将其作为广播发送时,即使外部类没有实现可序列化,它也能正常工作。为什么在将它发送到另一个活动时它是不可序列化的。另请注意,当我将对象作为广播发送时,我是从服务发送的。即使从服务 startActivity(intent) 也不序列化 @Venkatesh 你如何在广播中发送它?你用同样的方法putSerializable()
吗?
这也可能与 Activity
有关,因为 MainActivity 扩展了它,但在您的其他情况下,您的外部类扩展了什么(如果它扩展了什么?)我不确定 只是猜测 :)
是的,使用了相同的 putSerializable()。它工作得很好。外部类是 Service 的子类。以上是关于通过意图在活动之间传递自定义对象时出错的主要内容,如果未能解决你的问题,请参考以下文章