2012年12月17日月曜日

AndroidでSingletonパターンをやりたい


謎の何か。

さて、下記の記事、android開発では基本らしいのですが知らない人はびっくりするんじゃないでしょうか?

http://mobileapplication.blog.fc2.com/blog-entry-2.html
http://mobileapplication.blog.fc2.com/blog-entry-3.html

端的に言うとAndroidではメモリ不足等の場合に、生存中のActivityのメンバ変数が勝手に開放される場合がある、って事ですね。

自分も知らなかったのですが…
Androidアプリを開発したての頃に頻発してた原因不明の例外はこれだったみたいです。

でもまあ、良く見りゃちゃんとDeveloper's Guideにも載ってます。

http://developer.android.com/guide/components/activities.html#SavingActivityState

読んでねぇ。
もちろんそこまで読んでねぇ。
最初に言って欲しいわそれは。

そもそも普通にソフト勉強してくと「変数は値が保証される」って半ば無意識に前提にしちゃうと思うんですが、正直その前提というか価値観が崩れる衝撃でした。おおげさ?

しかしメンバ変数についてはユーザーにコールバックという形で通知が来るので百歩譲って良しとしましょう。(その対応として分かりきった手続きを毎回アプリ設計者に実装させる意図はよく分かりませんが・・・)

しかしstaticに至ってはいつ消去されるかすら分からない模様。
ざ、斬新すぎじゃよ?

これの意味する所は、AndroidアプリでSingletonパターンは使えないって事ですよねそうですよね違いますかね?

Androidアプリでは、オブジェクトの生存を保証するものはActivity、という事だと言えそうです。つまり設計上Sigletonなインスタンスが存在するのであれば、それは常にrunningなActivityから参照されている(かつ適切にonSaveInstanceState()/onRestoreInstanceState()されている)必要があるわけです。

もはやSingleton"パターン"ではないですね…

なお、詳細はDeveloper's Guideを見てもらうのが良いのですが、メンバ変数の退避はBundleインスタンスに対して保存する形を取っています。つまり、基本型(intとか配列とか。Stringも基本みたいなもので)か、ParcelableもしくはSerializableなクラスでないといけません。好き勝手にオリジナリティー溢れるクラスやら作りまくってActivityにぶらさげまくってると破綻するって事になるので注意した方が良いですね。

0 件のコメント:

コメントを投稿