Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中的活动之间共享对象_Android_Sharing_Serializable - Fatal编程技术网

在Android中的活动之间共享对象

在Android中的活动之间共享对象,android,sharing,serializable,Android,Sharing,Serializable,这是我的问题 我有一个类DataBaseHelper.java,它处理所有数据库操作(创建表、插入数据、删除表、选择数据等),我的主要活动中有一个该类的实例。我现在想做的是在其他活动中使用DataBaseHelper的实例 目前,我已声明DataBaseHelper实现可序列化: public class DataBaseHelper implements Serializable{ ... } 因此,我可以使用 intent.putExtra("key",dbh) 并在其他活动中使用 Da

这是我的问题

我有一个类DataBaseHelper.java,它处理所有数据库操作(创建表、插入数据、删除表、选择数据等),我的主要活动中有一个该类的实例。我现在想做的是在其他活动中使用DataBaseHelper的实例

目前,我已声明DataBaseHelper实现可序列化:

public class DataBaseHelper implements Serializable{ ... }
因此,我可以使用

intent.putExtra("key",dbh)
并在其他活动中使用

DataBaseHelper db = (DataBaseHelper) getIntent().getSerializableExtra("key");
但当我测试应用程序时,我会在日志中看到:

10-17 09:28:16.515: E/AndroidRuntime(2704): FATAL EXCEPTION: main
10-17 09:28:16.515: E/AndroidRuntime(2704): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = tian.proto.lib.DataBaseHelper)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.Parcel.writeSerializable(Parcel.java:1176)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.Parcel.writeValue(Parcel.java:1130)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.Parcel.writeMapInternal(Parcel.java:488)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.Bundle.writeToParcel(Bundle.java:1552)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.Parcel.writeBundle(Parcel.java:502)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.content.Intent.writeToParcel(Intent.java:5623)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1341)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.app.Activity.startActivityForResult(Activity.java:2827)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.app.Activity.startActivity(Activity.java:2933)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at tian.proto.Main$asyncLogin.onPostExecute(Main.java:207)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at tian.proto.Main$asyncLogin.onPostExecute(Main.java:1)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.AsyncTask.finish(AsyncTask.java:417)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.Looper.loop(Looper.java:130)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.app.ActivityThread.main(ActivityThread.java:3687)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.lang.reflect.Method.invokeNative(Native Method)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.lang.reflect.Method.invoke(Method.java:507)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at dalvik.system.NativeStart.main(Native Method)
10-17 09:28:16.515: E/AndroidRuntime(2704): Caused by: java.io.NotSerializableException: tian.proto.Main
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1143)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:413)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1241)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1575)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
10-17 09:28:16.515: E/AndroidRuntime(2704):     at android.os.Parcel.writeSerializable(Parcel.java:1171)
10-17 09:28:16.515: E/AndroidRuntime(2704):     ... 22 more
我做错了什么?也许这不是在活动之间共享对象的正确方式?我能做些什么


谢谢

你试过这种方法吗

Bundle b = this.getIntent().getExtras();
if(b!=null)
DatabaseHelper dh = (DatabaseHelper) b.getParcelable("key");

这不是您想要的,但是如果您想要共享一个类的实例,那么将其作为可序列化对象可能没有用处。我怀疑的是,为了访问类的所有方法,您可能需要这样的东西,等等

DataBaseHelper db = new DataBaseHelper(this);
在onCreate中尝试一下


序列化对象更适合于在类内部创建或修改的对象,如ArrayList或其他东西(尽管getter/setter方法可能更传统、更有用)

为什么要序列化数据库帮助程序?像这样的类可能应该组织为单音,由于您的应用程序中可能只需要一个DatabaseHelper实例。什么时候DatabaseHelper是可包裹的?如果我创建一个自定义类,它实现了可包裹,显然,我不知道为什么会出现问题。舒尔。但是你从来没有在你的帖子里提到过实际上必须实现Parcelable接口。因此,你的例子要么不完整,要么会带来另一个例外。我的答案是不完整的,它只能通过Parcelable类的实现来实现