6196


下記のコードの`getActivity().runOnUiThread`で`Null`が返ってきてしまいます。  
なので、`getActivity`の値をログで確認してみると、`Null`になっていました。  
これはどうしてなのでしょうか？今まで普通に`getActivity`を使ってたように使っているつもりなのですが......。

[code]

    public class testDialog extends DialogFragment {
        private Handler handler = new Handler();
        private Runnable runnable = new Runnable() {
            @Override
            public void run() {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
    
                    }
                });
            }
        };
    
[/code]


CC BY-SA 3.0
2015-02-09T13:15:59.840
6194
2015-02-09T14:20:05.757
5210
question
android
getActivity()でnullが返ってくる


この`runnable`が実行される前にダイアログが閉じられていたり、アプリが終了していたりしませんか？もしくは、ダイアログが表示される前に実行されていたりしませんか？


CC BY-SA 3.0
2015-02-09T13:34:19.953
6195
2015-02-09T13:34:19.953
845
6194
answer


> [public final
> getActivity()](http://developer.android.com/reference/android/app/Fragment.html#getActivity\(\))  
>  Return the Activity this fragment is currently associated with.

ドキュメントにもありますように、`getActivity()`とは、 **現在`Fragment`と関連付けられている`Activity`**
を返すメソッドになります。

「現在関連付けられている」の定義とは、[`Fragment`のライフサイクル](http://developer.android.com/guide/components/fragments.html)のうち`onAttach()`から`onDetach()`までを指します。

ライフサイクルの終了した`Fragment`が`Activity`への参照を持ち続けると、メモリリークに繋がるためです。また、`setRetainInstance(true)`をコールした`Fragment`は、複数の`Activity`と関連付けられることもあります。

そのため、`Runnable#run()`のような非同期処理で`getActivity()`を呼び出すべきではありません。取得した`Activity`が想定したものとは限りませんし、`DialogFragment`のような短命な`Fragment`では`null`が返却されます。


CC BY-SA 3.0
2015-02-09T14:20:05.757
6196
2015-02-09T14:20:05.757
5337
6194
answer