2011年02月20日

Androidのダイアログ表示でメモリリーク?

なんか、Androidでのダイアログ表示の仕方って、
いろんなサイト見ていると、AlertDialog.Builder#show()呼び出しているがすごく多い。
「Android ダイアログ 表示」とかで検索するとそれはもういっぱい引っかかる。

たしかに、それで表示は出来るんだけどさ。
正しくは動かないと思う。裏で。

showってメソッド、普通は、voidかbooleanだと思うの。
でも、Andoridだと、Dialogなインスタンスが戻ってくるの。
なんか疑問に思ったりしないかなぁ?

開発ガイドのダイアログ作成部分には、
AlertDialog#showなんてメソッドは一切記載がなかったりするんだけどね。
開発ガイド読んでないのかな。

まぁ、別に読んでないのはわたしも一緒だからいいんだけど、
やばいコードは余り広めない方がいいと思うんだよね。

え?ダイアログちゃんと表示されるじゃん、って人は、
開発環境とかでログを表示しながら、実際にダイアログを表示して、縦横切り替えをしてみるといいと思うの。
「android.view.WindowLeaked」って表示されるんじゃないかな〜。
いろいろ試して起きなければ、きっと、正しく作られてるから大丈夫だよ!

Dialogは、Activityの一部として扱われるから、Activityのライフサイクルにのせてあげないといけないの。
のせないなら、自前でちゃんと管理しないとダメってことね。

ライフサイクルにのせる方法は、ActivityのonCreateDialog(int)で生成してreturnで返してあげるしかないみたい。
Dialog#setOwnerActivityを使ってもダメだったから、今のところそれしか方法無いのかなーってわたしは思ってる。

ここで、showの返値がDialogになってる理由がちょっとわかる。
そう、AlertDialog.Builderでshowすると、返値がDialogじゃないとライフサイクルに載せられないってことね。

ちなみに、new AlertDialog.Builder(this)みたいにしてActivityセットしてるよ?って言う人は、
もう一度API見てください。引数がContextになってるはず。
なので、そこはActivityである必要はなく、ライフサイクルにものらない(のってもいい気はするけど)。

なので、自前で、管理しきる自身のない人は、onCreateDialog(int)でダイアログをreturnしてあげるといいと思う〜。

あ、そうそう、さっきの縦横切り替えで大丈夫じゃん。って思った人。
あと、縦横切り替えでダメなら、AndroidManifest.xmlのAcitivityの属性に、
「android:configChanges="orientation|keyboardHidden"」書けばいいじゃんって思った人。
RootActivity以外でDialog表示して、Homeキーとかおして別の重いアプリとか起動してみるといいんじゃないかなー。
きっと、裏でActivityが終了して同じエラーが出るよ(試してないけどね!)。

自信がなければ、Androidのダイアログは、onCreateDialog(int)で作りましょう。と言う話でした(・x・それだけっ
タグ:android
posted by すふぃあ at 13:25| Comment(4) | TrackBack(0) | 雁字

2011年02月13日

エネクとラティと

AndroidからPCを操作できるようにアプリを作ってみたよ。

VNCとか難しそうだったので、独自プロトコルで作ってる。
暗号化されてないけど、まぁ、いいよね。暗号化したければ、SSHでも何でもやればいいし〜。

サーバーアプリがエネク。→ClickOnce版
クライアントアプリが。→ラティ。→Android Market版
になってる。

Zip版もあるけど、今回のはClickOnce版を推奨〜。自動アップデートあるからね〜。

接続、クリック、キー入力、だいたい一通り出来るようになったかな。
メディアプレイヤー系の操作もできるし、プレゼンツールの操作もある程度できる感じ……。

なんか、リモート操作、って言うより、リモコン……?みたいな感じになってきてるような……。
まぁ、いいよね!(゜▽、゜
タグ:android
posted by すふぃあ at 22:10| Comment(0) | TrackBack(0) | 雁字