0

私のアプリにはMainActivityというActivityクラスがあり、そのメンバーの1つは

public static SharedPreferences prefsdefault;

私のアプリには、バックグラウンドで実行されるサービス(別のプロセス)もあります。私が書いたサービスの中で

MainActivity.prefsdefault.getString(Key,"Hello");

アプリは、この行でnullポインター例外をスローすることがあります。なんで?アクティビティを閉じたときにこのメンバーがガベージコレクターによってクリーンアップされ、いつでも(サービスの実行時に)アクセスできないということですか?では、これに対する完璧な解決策は何ですか?

MainActiviy.classをサービスに渡す必要がありますか?これは、コンテキストを必要とするスレッドを実装するときにも発生します。

4

3 に答える 3

1

これは、prefsdefaultが一度初期化された場合でも、アプリ全体をガベージコレクションして再起動できるためです。

その場合、サービスはそのフィールドをnullとして検出します。アクティビティ内で静的フィールドを使用することは、さまざまな理由で間違っています。最も重要なのは、オペレーティングシステムによってアプリが強制終了されて再起動され、その後、すべての静的フィールドが再度消去される可能性があることです。

共有設定を使用する正しい方法は、アクセス/書き込みが必要なときはいつでもgetSharedPreferencesを使用してそれらにアクセスすることです。

もう1つの奇妙なことは、サービスが別のプロセスで実行されていると言うことです。その場合、別のプロセスからのデータにアクセスできないようにする必要があります。

于 2013-03-10T18:34:14.353 に答える
0

ですから。prefsdefault_ NULL初期化されているようには見えません。あなたはそれをすることができます

prefsdefault = getSharedPreferences("my_preferences", Activity.MODE_PRIVATE);

ヒント:SharedPreferenceインスタンスを静的にしないでください。

于 2013-03-10T18:29:35.103 に答える
0

この理由は初期化されていません。MODEがプライベートの場合はアプリでグローバルに利用できるため、このSharedPreferencesようにする必要はありませんSharedPreferences。サービスで新しいインスタンスを作成するだけで機能します。

于 2013-03-10T18:29:39.930 に答える