閉じる

View not attached to window manager

アクティビティの onCreateでダイアログを作成し、スレッドを起動をして時間の掛かる処理を行い、ダイアログを閉じる処理をしていた。
そこへ setRequestedOrientationを使って画面の回転を制御するコードを入れたところ、ダイアログを閉じるタイミングで件のエラーが出るようになった。
エラーの発生条件を調べてみると、ダイアログを閉じるタイミングで親ウィンドウが失われていると件のエラーになるらしい。
動きを追ってみると、onCreate内の setRequestedOrientation呼び出しによってアクティビティが廃棄&再作成された結果、スレッドだけが取り残されて…という事になっていた模様。
仕方がないので時間の掛かる処理をアクティビティ作成前に行うようにして逃げ。
今回はアクティビティの内容が時間の掛かる処理に依存するのでこれでいいけど、普通は困るよなぁ
ダイアログを作りっぱなしにしないでアクティビティが消えるときにちゃんと後始末をしようという事か。

2013/01/17追記

結局の所、巷にあふれている Dialog#showを直接呼び出してしまうコーディングが元凶なのよね。
確かに初期の Activity#showDialogはかなり使い勝手が悪かったけど、今は Bundleで引数が渡せるので素直に Activity#showDialogを使いましょうと。

今となっては DialogFragmentを使うことになるだろうけど*1 、これも Dialog#show直接呼び出しのような誤った使い方が出来てしまうので注意が必要。

ちなみに、スレッドからダイアログへアクセスするようなコードは対象となるダイアログやアクティビティが生きているかまじめにチェックするしかなさそう。


*1 2.xx等でも Support Library入れれば済む話だし

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)