2013/11/06

DialogFragment#dismiss() で NullPointerException がたまにでる。

「たまにでる」ここぽいんと。

ローディングのくるくるダイアログとか DialogFragment とかって出すことは、まあよくあると思う。そんな感じで出してたら NullPointerException でた。
こんな感じのとこ。

// ダイアログ出すとこは
// this.mLoadingDialog = LoadingDialog.newInstance("ちょっとまってねっ!");
// っていう感じでメンバ変数に入れといてる。
if (this.mLoadingDialog != null) {
this.mLoadingDialog.dismiss(); // ここでぬるぽ
}
view raw gistfile1.java hosted with ❤ by GitHub


いやいや、null じゃなければって言ってるでしょ?どうも DialogFragment の中で何かが null っぽい(例外メッセージ忘れた)なので、こう変えた。

// ダイアログ出す時
FragmentManager fragmentManager = this.getSupportFragmentManager();
LoadingDialog dialogFragment = LoadingDialog.newInstance("ちょっとまってねっ!");
dialogFragment.show(fragmentManager, LoadingDialog.DIALOG_TAG);
// ダイアログ消す時
FragmentManager fragmentManager = this.getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(LoadingDialog.DIALOG_TAG);
if (fragment != null && fragment instanceof DialogFragment) {
((DialogFragment)fragment).dismiss();
}
view raw gistfile2.java hosted with ❤ by GitHub


TAG を指定して生成、消すときも TAG 指定で取得、fragment が帰ってくるから一応 null チェックとそいつが DialogFragment かどうかを見て、dismiss() 呼び出す。これで一応 NullPointerException はなくなりました。ここらへんどうなんだろうかっていうのはある。ドキュメント見てもshow() の例は書いてるけど dismiss() の例もないものね。

追記


12-03 17:57:12.331: E/AndroidRuntime(5279): java.lang.NullPointerException
12-03 17:57:12.331: E/AndroidRuntime(5279): at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:184)
12-03 17:57:12.331: E/AndroidRuntime(5279): at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:155)


こんなかんじの例外でした。