Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
static変数さんと
Activityさん
Androidで
static変数を使うと。。。
登場人物
● static変数さん
○ publicだとクラスを知ってる人なら誰でもアクセスでき
るよ
○ singletonで使う人もいるよね
○ プロセスが止まると中身無くなるよ

● Activityさん
○ アプリの基本要素だよ
○ ラ...
static変数さんを使いたくなる時
サービスのアクセストークンをアプリの起動中、
保存したい
ログイン後、
SharedPreferencesに保存して、
static変数にアクセストークンをセット
そして次のActivity/Fragmen...
つまり。。。
static変数に値をセットするのは

最初のActivityのみ

(毎回SharedPreferencesから読むのなら、
そもそもstatic変数に値セット、しないよね)
で、いつ使うんだっけ?

アプリの起動中、保存したい

アプリの起動中、保存したい

アプリの起動中、保存したい
アプリの起動中って
プロセスが生きている間のことだよね?

それ、ホントか?
Activityのライフサイクル
onCreate()
↓
onStart()
↓
onResume()
↓

onPause()
↓
onStop()
↓
onDestroy()

(http://developer.android.com/...
ホームボタンを押すとどうなる?
●
●
●
●

onPause()が呼ばれる
アプリの実行は中断される
アプリの実行は中断される
アプリの実行は中断される
Activityがバックグラウンドにいる
システムリソース(メモリなど)が足りなくなると、
Activityインスタンスが破棄される
状況によっては、

プロセスも止まる
Activityインスタンスの破棄
後で復元するために、
onSaveInstanceState()が実行される
退避したBundleはonCreate()などで
引数として復元用に渡される
プロセスが止められると
static変数さんの中身は

無くなる

(さよならstatic変数さん)
アプリ切り替えで再開
Activityが破棄されていたら?
onCreate()の引数に、退避させたインスタンス
の情報が入ってる
復元可能!
(というか復元してくださいおねがいします)
プロセスが殺されてたら?
アプリ最初から起動しなおし?

(まさかね。。。)
現実は。。。
1. プロセスをもう一度立ち上げる
2. Activityの復元を行う
3. ホームボタンを押した時点に戻る(ちゃんと
作っていれば)

最初からじゃない!
static変数さんの中身は?
設計では、ログイン用Activityでのみセットだった
よね?
途中から再度プロセスが起動すると、セットする
タイミングは?
消えるケースがあるのはわかった
でも、実際にプロセスまで殺されるケースって、
再現難しくない?
Activityであれば、開発者オプションにあるけ
ど。。。
DDMSで止めれます
開発中アプリのプロセスを選んで
真ん中のSTOPボタン

(画像つぶれててすいません。。)
static変数さんを空にしてみよう
再現手順のまとめ
1. static変数に値をセットする
2. 次のActivityに遷移する
3. ホームボタンを押してアプリ中断
4. DDMSでプロセスを止める
5. アプリ切り替えでアプリ再開
6....
ということで
アプリ起動中にstatic変数の中身が空になる
ケースは

あります

メモリキャッシュのような、消えてもあまり困らな
いものを入れる程度にしておいたほうが吉(と、
fkmさんは感じてる)
static変数さんと
Activityさん
完?
著 @fkm
Próxima SlideShare
Cargando en…5
×

[Android]Static変数さんとactivityさん

Androidでstatic変数を使っていて、「あれ、いつの間にか値がnullになっている?」みたいなのに遭遇したこと、ありませんか?

このスライドでは、そのような状況がどんな仕組みで発生するかと、開発時の再現方法を紹介します。

  • Sé el primero en comentar

[Android]Static変数さんとactivityさん

  1. 1. static変数さんと Activityさん Androidで static変数を使うと。。。
  2. 2. 登場人物 ● static変数さん ○ publicだとクラスを知ってる人なら誰でもアクセスでき るよ ○ singletonで使う人もいるよね ○ プロセスが止まると中身無くなるよ ● Activityさん ○ アプリの基本要素だよ ○ ライフサイクルがあるよ ○ インスタンスは状況によって破棄されるよ
  3. 3. static変数さんを使いたくなる時 サービスのアクセストークンをアプリの起動中、 保存したい ログイン後、 SharedPreferencesに保存して、 static変数にアクセストークンをセット そして次のActivity/Fragmentに遷移
  4. 4. つまり。。。 static変数に値をセットするのは 最初のActivityのみ (毎回SharedPreferencesから読むのなら、 そもそもstatic変数に値セット、しないよね)
  5. 5. で、いつ使うんだっけ? アプリの起動中、保存したい アプリの起動中、保存したい アプリの起動中、保存したい
  6. 6. アプリの起動中って プロセスが生きている間のことだよね? それ、ホントか?
  7. 7. Activityのライフサイクル onCreate() ↓ onStart() ↓ onResume() ↓ onPause() ↓ onStop() ↓ onDestroy() (http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle)
  8. 8. ホームボタンを押すとどうなる? ● ● ● ● onPause()が呼ばれる アプリの実行は中断される アプリの実行は中断される アプリの実行は中断される
  9. 9. Activityがバックグラウンドにいる システムリソース(メモリなど)が足りなくなると、 Activityインスタンスが破棄される 状況によっては、 プロセスも止まる
  10. 10. Activityインスタンスの破棄 後で復元するために、 onSaveInstanceState()が実行される 退避したBundleはonCreate()などで 引数として復元用に渡される
  11. 11. プロセスが止められると static変数さんの中身は 無くなる (さよならstatic変数さん)
  12. 12. アプリ切り替えで再開
  13. 13. Activityが破棄されていたら? onCreate()の引数に、退避させたインスタンス の情報が入ってる 復元可能! (というか復元してくださいおねがいします)
  14. 14. プロセスが殺されてたら? アプリ最初から起動しなおし? (まさかね。。。)
  15. 15. 現実は。。。 1. プロセスをもう一度立ち上げる 2. Activityの復元を行う 3. ホームボタンを押した時点に戻る(ちゃんと 作っていれば) 最初からじゃない!
  16. 16. static変数さんの中身は? 設計では、ログイン用Activityでのみセットだった よね? 途中から再度プロセスが起動すると、セットする タイミングは?
  17. 17. 消えるケースがあるのはわかった でも、実際にプロセスまで殺されるケースって、 再現難しくない? Activityであれば、開発者オプションにあるけ ど。。。
  18. 18. DDMSで止めれます 開発中アプリのプロセスを選んで 真ん中のSTOPボタン (画像つぶれててすいません。。)
  19. 19. static変数さんを空にしてみよう 再現手順のまとめ 1. static変数に値をセットする 2. 次のActivityに遷移する 3. ホームボタンを押してアプリ中断 4. DDMSでプロセスを止める 5. アプリ切り替えでアプリ再開 6. static変数の値を使う処理を行う
  20. 20. ということで アプリ起動中にstatic変数の中身が空になる ケースは あります メモリキャッシュのような、消えてもあまり困らな いものを入れる程度にしておいたほうが吉(と、 fkmさんは感じてる)
  21. 21. static変数さんと Activityさん 完? 著 @fkm

×