0

これが私の問題です...

すべてのデータベース操作 (テーブルの作成、データの挿入、テーブルの削除、データの選択など) を処理するクラス DataBaseHelper.java があり、メイン アクティビティにそのクラスのインスタンスがあります。私が今やりたいことは、他のアクティビティでその DataBaseHelper のインスタンスを使用することです...

現在、DataBaseHelper が Serializable を実装していると宣言しました。

public class DataBaseHelper implements Serializable{ ... }

を使用してインスタンスを渡すことができます

intent.putExtra("key",dbh)

を使用して他のアクティビティでそれを受け取ります

DataBaseHelper db = (DataBaseHelper) getIntent().getSerializableExtra("key");

しかし、アプリをテストすると、LogCat で次のようになります。

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

私は何を間違っていますか?これは、アクティビティ間でオブジェクトを共有する正しい方法ではないでしょうか? これについて何ができますか?

ありがとう!

4

2 に答える 2

0

これはあなたが意図したものではありませんが、クラスのインスタンスを共有したい場合、それをシリアライズ可能なオブジェクトとして置くことは役に立たないかもしれません. 私が疑うのは、クラスのすべてのメソッドなどにアクセスするために、このようなものが必要になるということです

DataBaseHelper db = new DataBaseHelper(this);

onCreateでそれを試してください。

オブジェクトのシリアル化は、配列リストなどのクラス内で作成または変更されたオブジェクト向けです(ただし、getter/setter メソッドはおそらくより従来型でより便利です)

于 2012-10-17T16:00:50.177 に答える
-1

この方法で試しましたか?

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

レシーバー部分から。

于 2012-10-17T15:55:39.493 に答える