2011年7月2日土曜日

Contextについて

ActivityのContext。よく使うと思います。
Intent経由で、他のActivityを起動するときなど、Intentに、Contextを指定するときは、大体以下のコードを書きます。

Intent(this, nextActivity.class)

これは、ActivityがContextのサブクラスであるためです。

でもって、モジュール的に、ActivityのサブクラスではないClassが、(Intent起動など)Contextを使う場合、
Activityから渡してやります。

でも、これが、どうやら、クセモノらしい。

そもそも、Contextとしてthisを指定するということは、Contextのライフサイクルが
Activityのライフサイクルと一致していないといけないわけです。

一致していない場合、なんらかのExceptionが発生する。
・・・のなら、いいのですが(デバッグしてればわかるから)、実は普通にメモリリークするらしい。

つまり、thisを指定して使われているContextが、Activity終了しても、他のモジュールから
参照されちゃってる場合、
「そのActivityが、ガベージコレクションされない」状態になっちゃうみたい。
��サンプルコード載せたいけど、試したコードがどっかいっちゃった・・・

なので、Activityのライフサイクル≠Context(を使用しているClass)のライフサイクルの場合、
Activity:getApplicationContext()を使ったほうがいいみたい。
こちらは、自分のつくっているアプリケーションが、Activityとは別に持っているContextを取得します。
(別じゃないパターンもあるみたいだけど、これは問題にならない)
アプリケーションが生きてる場合は、Contextを使用しても問題ない、ってことです。

実は、この問題は、こっそりここに書いてあります

http://developer.android.com/reference/android/content/Context.html#getApplicationContext()

うーん、このメソッドを見る人は、ここで書いたこと、わかってると思うんですけどね、、、(w

0 件のコメント:

コメントを投稿