SharedPreferencesが勝手に消去

3,661 views
Skip to first unread message

moriti

unread,
Mar 7, 2011, 7:21:12 AM3/7/11
to Android-SDK-Japan
ホームウィジェットアプリを作成しているのですが、不具合があり解決できません。
どのタイミングか分かりませんが、SharedPreferencesが無くなり、アプリが初期化状態になります。
SharedPreferences内を削除する処理は、ウィジェットを削除するときのみに施しているので、勝手に、
SharedPreferencesの内容が消える原因が分かりません。
タイミングが分からないので、状況を説明することもできず、状況も再現することができません。
良くあるのが、実機にUSBで接続し、デバッグしている最中に、急にADBが切断し、SharedPreferencesが無くなっていたということは
あります。
ほとんどのケースがUSBデバッグを有効にして、PCと接続したときに上記の不具合が発生しているように感じます。
USB接続が原因なのかはわかりませんが、SharedPrefarencesが消えるようなケースやその対処法などを教えて頂けないでしょうか?

adamrocker

unread,
Mar 7, 2011, 7:37:34 AM3/7/11
to android-...@googlegroups.com, moriti
お使いの端末の機種は何でしょうか?
それともエミュレータで発現しますか?
あと、API Levelなども分かればお教え下さい。

よろしくお願いします。

2011/3/7 moriti <mor...@enjoy.ne.jp>:

> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
>
>

moriti

unread,
Mar 7, 2011, 7:47:09 AM3/7/11
to Android-SDK-Japan
回答ありがとうございます。

端末は、HT03A(CyanogenMod-6.1)です。
アプリを利用しているユーザ(GalaxyS)でも同様の不具合が発生しているようです。
エミュレータでは、今のところ確認されていません。
API Levelは1.6にて作成しています。

よろしくお願いします。

adamrocker

unread,
Mar 7, 2011, 8:56:08 AM3/7/11
to android-...@googlegroups.com
同様の不具合に出会った事が無いので
ソースコードを調べただけでの推測になりますが…

SharedPreferencesはファイルの読み書きです。
ContextImpl.javaというファイルに実装がありますが、
SharedPreferenceへcommit中にファイルの実体に変化があると
対応できないかもしれません。
たとえば、ファイルをcommit中(openしてcloseする前)にストレージへアクセス
できずファイルIOできなくなるとかですが、かなりレアなパターンかもしれません。

USBを接続した時に消えているかもしれないとの事なので
commit中にUSB接続していたりしませんか?
#マルチスレッドでのcommitが怪しいかとも思ったのですが
#ちゃんとスレッドセーフな実装になっていました。

ちなみにSharedPreferenceを保存する先はApplicationInfo.dataDirの中みたいです。
http://developer.android.com/intl/ja/reference/android/content/pm/ApplicationInfo.html#dataDir
データが消えているというのはココに保存されているファイルが消えているか
確認してみて下さい。
フォーマット(XML)が崩れているだけかもしれません。

なおGingerbreadのソースで確認したので、1.6ではちょっと違うかもしれません。

2011/3/7 moriti <mor...@enjoy.ne.jp>:

moriti

unread,
Mar 8, 2011, 8:27:54 AM3/8/11
to Android-SDK-Japan
adamrokerさんありがとうございます。

どのタイミングで不具合が発生するかわかりませんが、発生したときに確認してみます。
スレッドセーフになっていると言うことですが、同じSharedPreferencesに別々のスレッドから同時にcommitしても問題は無いと言う
ことでしょうか?
現在疑っている所があり、SharedPreferencesに多数の文字列を書き込むケースがあり、それをcommit中に別のスレッドから、
commitした場合におかしくなっているのかなと思っています。
現在は、そのようなケースが無いように対策をしようとしています。

On 3月7日, 午後10:56, adamrocker <adamroc...@gmail.com> wrote:
> 同様の不具合に出会った事が無いので
> ソースコードを調べただけでの推測になりますが…
>
> SharedPreferencesはファイルの読み書きです。
> ContextImpl.javaというファイルに実装がありますが、
> SharedPreferenceへcommit中にファイルの実体に変化があると
> 対応できないかもしれません。
> たとえば、ファイルをcommit中(openしてcloseする前)にストレージへアクセス
> できずファイルIOできなくなるとかですが、かなりレアなパターンかもしれません。
>
> USBを接続した時に消えているかもしれないとの事なので
> commit中にUSB接続していたりしませんか?
> #マルチスレッドでのcommitが怪しいかとも思ったのですが
> #ちゃんとスレッドセーフな実装になっていました。
>
> ちなみにSharedPreferenceを保存する先はApplicationInfo.dataDirの中みたいです。http://developer.android.com/intl/ja/reference/android/content/pm/App...

adamrocker

unread,
Mar 8, 2011, 8:54:51 AM3/8/11
to android-...@googlegroups.com

Gingerbreadのコードを読む限り問題ないように見えました。
edit()メソッドを呼ぶとオブジェクトをnewしているようなので。

2011/03/08 22:27 "moriti" <mor...@yahoo.co.jp>:
Reply all
Reply to author
Forward
0 new messages