2

現在、バッテリー レベルなどの特定のイベントに基づいて電話の状態を自動的に変更する Android アプリに取り組んでいます。名前、イベント、状態の 3 つの主要なパラメーターを持つプロファイル クラスがあります (イベントと状態は他の 2 つのカスタム クラスです)。

私の ProfileEdit クラスには、ユーザーがプロファイルを構成するための EditText や Spinner などのさまざまなコンポーネントがあります。各プロファイルを表示する ListActivity クラスの Profile タイプの ArrayList と、現在の ArrayList を取得して新しいプロファイルを追加または更新する ProfileEdit クラスにアクセスする必要があります。

最初にこれを行う必要があったのは、ObjectOutputStream を使用して ArrayList を電話の SD カードに書き込むことでした。その後、それを必要とする任意のクラスで取得できます。ただし、これまでにこれを実行しようとすると、IOException がスローされるだけです。私のコードは次のとおりです。

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/sdcard/profile.prof"));
oos.writeObject(profiles);
oos.flush();
oos.close();

プロファイル オブジェクトは、ファイルに書き込まれる ArrayList です。これが例外をスローする理由がわかりません。writeObject("Hello"); を呼び出して、オブジェクトを文字列に変更しようとしました。例外がスローされなくなったため、ArrayList に問題があるとしか考えられません。ArrayList クラスは serializable を実装し、私の Profile クラスも serializable を実装しているという印象を受けましたが、なくても同じことを行います。

または、ProfileList (ListActivity) クラスと ProfileEdit クラスの両方に同じ ArrayList へのアクセスを許可するより良い方法がある場合は、お知らせください。

編集: IO Exceptions スタック トレースは次のとおりです: (ProfileEdit クラスの 114 行目は writeObject() 行です)

EZSettings(14788): IO Exception
EZSettings(14788): java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535)
EZSettings(14788): java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
EZSettings(14788): java.util.ArrayList.writeObject(ArrayList.java:651)
EZSettings(14788): java.lang.reflect.Method.invokeNative(Native Method)
EZSettings(14788): java.lang.reflect.Method.invoke(Method.java:507)
EZSettings(14788): java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1219)
EZSettings(14788): java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1575)
EZSettings(14788): java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
EZSettings(14788): com.ezstatechanger.ProfileEdit.saveState(ProfileEdit.java:114)
EZSettings(14788): com.ezstatechanger.ProfileEdit.access$0(ProfileEdit.java:80)
EZSettings(14788): com.ezstatechanger.ProfileEdit$1.onClick(ProfileEdit.java:72)
EZSettings(14788): android.view.View.performClick(View.java:2538)
EZSettings(14788): android.view.View$PerformClick.run(View.java:9152)
EZSettings(14788): android.os.Handler.handleCallback(Handler.java:587)
EZSettings(14788): android.os.Handler.dispatchMessage(Handler.java:92)
EZSettings(14788): android.os.Looper.loop(Looper.java:123)
EZSettings(14788): android.app.ActivityThread.main(ActivityThread.java:3691)
EZSettings(14788): java.lang.reflect.Method.invokeNative(Native Method)
EZSettings(14788): java.lang.reflect.Method.invoke(Method.java:507)
EZSettings(14788): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
EZSettings(14788): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
EZSettings(14788): dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

2

すべてのオブジェクトとそのすべてのフィールドはシリアライズ可能である必要があります。そうしないと、シリアライズできません。IO 例外のもう 1 つの原因は、SD カードへの書き込み権限がないことです。(あなたのアプリケーション以外の誰かがこのデータを必要としていますか? そうでない場合、それは証明領域に属します。)

設定データのシリアル化は便利ですが、悪い考えかもしれません。オブジェクトの署名が変更されると、データが読み取れなくなります。より良い解決策は、オブジェクトを JSON にマーシャリングし、このファイルを保存することです ( https://github.com/ko5tik/jsonserializerでの恥知らずな自己広告)

于 2011-12-06T13:43:52.170 に答える
0

Konstantin Pribluda は私がしなければならないことに対するより良い解決策を特定しましたが、この質問は解決されました。

Event クラスと State クラスが Serializable を実装していないという事実を見落としていたことが判明しました。Serializable クラス内のすべてのフィールドも Serializable である必要があります。そうでない場合、IO 例外がスローされます。

于 2011-12-06T22:57:36.987 に答える