使用可序列化将对象从活动传递到活动的正确方法?

Posted

技术标签:

【中文标题】使用可序列化将对象从活动传递到活动的正确方法?【英文标题】:Proper way of passing Object from Activity to Activity using Serializable? 【发布时间】:2015-10-08 07:40:50 【问题描述】:

我正在尝试将一个对象从一个活动传递到另一个活动,我的对象是 java 的自定义类并且已经实现了可序列化。主要问题,我找不到合适的方法来实现它。

类似类型的***上其他问题的所有答案,似乎都不能解决我的问题。

LogCat:

07-19 01:56:02.058: D/dalvikvm(4811): Late-enabling CheckJNI
07-19 01:56:02.218: I/PGA(4811): Attempting to create new SOCKET connectionn pid = 4811, tid = 4811
07-19 01:56:02.228: I/PGA(4811): New SOCKET connection: com.jutt.dotbot (pid 4811, tid 4811)
07-19 01:56:05.728: D/dalvikvm(4811): JIT code cache reset in 0 ms (1222 bytes 2/0)
07-19 01:56:05.728: D/dalvikvm(4811): GC_FOR_ALLOC freed 192K, 46% free 3775K/6968K, paused 0ms, total 0ms
07-19 01:56:05.738: I/dalvikvm-heap(4811): Grow heap (frag case) to 6.630MB for 560912-byte allocation
07-19 01:56:05.748: D/dalvikvm(4811): GC_FOR_ALLOC freed <1K, 43% free 4323K/7516K, paused 10ms, total 10ms
07-19 01:56:09.848: D/dalvikvm(4811): GC_FOR_ALLOC freed 15K, 43% free 4351K/7516K, paused 10ms, total 10ms
07-19 01:56:09.898: I/dalvikvm-heap(4811): Grow heap (frag case) to 16.785MB for 10618892-byte allocation
07-19 01:56:09.908: D/dalvikvm(4811): GC_FOR_ALLOC freed 20K, 18% free 14700K/17888K, paused 10ms, total 10ms
07-19 01:56:09.938: D/dalvikvm(4811): GC_FOR_ALLOC freed 14K, 16% free 15030K/17888K, paused 10ms, total 10ms
07-19 01:56:10.008: I/dalvikvm-heap(4811): Grow heap (frag case) to 27.990MB for 11432316-byte allocation
07-19 01:56:10.018: D/dalvikvm(4811): GC_FOR_ALLOC freed 1K, 10% free 26193K/29056K, paused 10ms, total 10ms
07-19 01:56:10.038: D/dalvikvm(4811): GC_FOR_ALLOC freed 7K, 10% free 26191K/29056K, paused 0ms, total 0ms
07-19 01:56:10.098: I/dalvikvm-heap(4811): Grow heap (frag case) to 38.775MB for 11312124-byte allocation
07-19 01:56:10.118: D/dalvikvm(4811): GC_FOR_ALLOC freed <1K, 8% free 37238K/40104K, paused 20ms, total 20ms
07-19 01:56:10.148: D/dalvikvm(4811): GC_FOR_ALLOC freed 3K, 8% free 37239K/40104K, paused 10ms, total 10ms
07-19 01:56:10.198: I/dalvikvm-heap(4811): Grow heap (frag case) to 50.183MB for 11962004-byte allocation
07-19 01:56:10.208: D/dalvikvm(4811): GC_FOR_ALLOC freed <1K, 6% free 48921K/51788K, paused 10ms, total 10ms
07-19 01:56:10.238: D/dalvikvm(4811): GC_FOR_ALLOC freed 9K, 6% free 48922K/51788K, paused 10ms, total 10ms
07-19 01:56:10.308: I/dalvikvm-heap(4811): Grow heap (frag case) to 60.312MB for 10618892-byte allocation
07-19 01:56:10.318: D/dalvikvm(4811): GC_FOR_ALLOC freed <1K, 5% free 59292K/62160K, paused 10ms, total 10ms
07-19 01:56:10.348: D/dalvikvm(4811): GC_FOR_ALLOC freed 17K, 5% free 59293K/62160K, paused 10ms, total 10ms
07-19 01:56:10.418: I/dalvikvm-heap(4811): Grow heap (frag case) to 71.720MB for 11962004-byte allocation
07-19 01:56:10.428: D/dalvikvm(4811): GC_FOR_ALLOC freed <1K, 4% free 70975K/73844K, paused 10ms, total 10ms
07-19 01:56:13.688: E/InputEventSender(4811): Exception dispatching finished signal.
07-19 01:56:13.688: E/MessageQueue-JNI(4811): Exception in MessageQueue callback: handleReceiveCallback
07-19 01:56:13.688: E/MessageQueue-JNI(4811): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.jutt.dotbot.ScoreSaver)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.os.Parcel.writeSerializable(Parcel.java:1316)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.os.Parcel.writeValue(Parcel.java:1264)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.os.Bundle.writeToParcel(Bundle.java:1692)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.os.Parcel.writeBundle(Parcel.java:636)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.content.Intent.writeToParcel(Intent.java:7013)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2076)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.app.Instrumentation.execStartActivity(Instrumentation.java:1502)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.app.Activity.startActivityForResult(Activity.java:3424)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.app.Activity.startActivityForResult(Activity.java:3385)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.app.Activity.startActivity(Activity.java:3627)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.app.Activity.startActivity(Activity.java:3595)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at com.jutt.dotbot.PointsDrawerActivity.onBackPressed(PointsDrawerActivity.java:205)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.app.Activity.onKeyUp(Activity.java:2193)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.KeyEvent.dispatch(KeyEvent.java:2664)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.app.Activity.dispatchKeyEvent(Activity.java:2423)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3852)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3558)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3718)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2023)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1705)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1696)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2000)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.os.MessageQueue.nativePollOnce(Native Method)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.os.MessageQueue.next(MessageQueue.java:138)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.os.Looper.loop(Looper.java:123)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at android.app.ActivityThread.main(ActivityThread.java:5021)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at java.lang.reflect.Method.invokeNative(Native Method)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at java.lang.reflect.Method.invoke(Method.java:515)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at dalvik.system.NativeStart.main(Native Method)
07-19 01:56:13.688: E/MessageQueue-JNI(4811): Caused by: java.io.NotSerializableException: android.app.SharedPreferencesImpl
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
07-19 01:56:13.688: E/MessageQueue-JNI(4811):   at java.io.Obj
07-19 01:56:13.688: D/AndroidRuntime(4811): Shutting down VM
07-19 01:56:13.688: W/dalvikvm(4811): threadid=1: thread exiting with uncaught exception (group=0x65d70b20)
07-19 01:56:13.688: D/AndroidRuntime(4811): procName from cmdline: com.jutt.dotbot
07-19 01:56:13.688: E/AndroidRuntime(4811): in writeCrashedAppName, pkgName :com.jutt.dotbot
07-19 01:56:13.698: D/AndroidRuntime(4811): file written successfully with content: com.jutt.dotbot StringBuffer : ;com.jutt.dotbot
07-19 01:56:13.708: I/Process(4811): Sending signal. PID: 4811 SIG: 9
07-19 01:56:13.708: E/AndroidRuntime(4811): FATAL EXCEPTION: main
07-19 01:56:13.708: E/AndroidRuntime(4811): Process: com.jutt.dotbot, PID: 4811
07-19 01:56:13.708: E/AndroidRuntime(4811): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.jutt.dotbot.ScoreSaver)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.os.Parcel.writeSerializable(Parcel.java:1316)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.os.Parcel.writeValue(Parcel.java:1264)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.os.Bundle.writeToParcel(Bundle.java:1692)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.os.Parcel.writeBundle(Parcel.java:636)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.content.Intent.writeToParcel(Intent.java:7013)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2076)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1502)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.app.Activity.startActivityForResult(Activity.java:3424)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.app.Activity.startActivityForResult(Activity.java:3385)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.app.Activity.startActivity(Activity.java:3627)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.app.Activity.startActivity(Activity.java:3595)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at com.jutt.dotbot.PointsDrawerActivity.onBackPressed(PointsDrawerActivity.java:205)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.app.Activity.onKeyUp(Activity.java:2193)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.KeyEvent.dispatch(KeyEvent.java:2664)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.app.Activity.dispatchKeyEvent(Activity.java:2423)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3852)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3558)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3718)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2023)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1705)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1696)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2000)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.os.MessageQueue.nativePollOnce(Native Method)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.os.MessageQueue.next(MessageQueue.java:138)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.os.Looper.loop(Looper.java:123)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at android.app.ActivityThread.main(ActivityThread.java:5021)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at java.lang.reflect.Method.invokeNative(Native Method)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at java.lang.reflect.Method.invoke(Method.java:515)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at dalvik.system.NativeStart.main(Native Method)
07-19 01:56:13.708: E/AndroidRuntime(4811): Caused by: java.io.NotSerializableException: android.app.SharedPreferencesImpl
07-19 01:56:13.708: E/AndroidRuntime(4811):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
07-19 01:56:13.708: E/AndroidRuntime(4811):     at java.io.ObjectOutputStream.w

【问题讨论】:

这个问题已经回答[这里][1] [1]:***.com/questions/2736389/… How to send an object from one Android Activity to another using Intents?的可能重复 我已经看到很多关于它的问题,但我不知道可序列化方法的示例,似乎对我不起作用,而是它使我的活动崩溃。 @SaschaKolberg 我添加了可序列化的自定义类,但由于某种原因,我似乎仍然无法将其从一个活动转移到另一个活动。 如果您愿意分享您看到的任何错误日志,它可能会有所帮助。或者更详细地描述传输失败的原因。 【参考方案1】:

在第一个要通过的 Activity 中:

Intent intent = new Intent(First.this, Second.class);
intent.putExtra("ObjectToPass", myObject);  
startActivity(intent);

在第二个 Activity 中检索对象:

MyObject myObject = (MyObject) getIntent().getSerializableExtra("ObjectToPass");

这是假设MyObject 类已经实现了Serializable

【讨论】:

这个方法不起作用,而是让我的活动崩溃。 这是正确的做法。什么是 Logcat 错误?发布。 @BadComputer 如果接收活动可能会在不传递对象的情况下启动,请确保在尝试使用之前测试 null。 我想我确实在接收活动中检查过,但接收活动只是崩溃。我评论了这个可序列化的传输代码,一切似乎都很好。【参考方案2】:

我认为当 obj 是您的对象时,您可以根据您的意图调用 intent.putExtra("key", obj),并键入您想要存储对象的键。在已启动的活动中,您可以调用 getIntent().getSerializableExtra("key") 来取回您的对象。见this link。

【讨论】:

以上是关于使用可序列化将对象从活动传递到活动的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

将Serializable数组从一个活动传递到另一个活动时的类Cast Exception

通过意图传递可序列化对象

将 Serializables 数组从一个活动传递到另一个活动时发生 Class Cast Exception

Android将自定义对象从服务传递给活动

Android 通过引用在活动之间传递对象

自定义可序列化对象数组列表的意图错误