2011年05月02日

もしわたしがAndroidのFragmentを使ったら


さて、だいぶ更新あいちゃったけど、

Fragment APIを一通り使ってみたので、書いてみようと思うの。

いつものように、普通のその辺のチュートリアル記事とかじゃおもしろくないので、

わざとそれとは違うことを書くですよ。




まず、よく見るのは、Fragment使うと、UIがとっても便利!みたいな話だよね。

これは、たしかにタブレットなAndroidで重要で、そのためにFragmentが作られたみたいだし間違ってはいない……気がする。

でも……、見た目ばかり先行しちゃって、重要なことが本当に理解はされていないと思うんだよね。

つまりね、一番重要なのは、「ライフサイクル動作までの単位で再利用を可能にしたこと」だと思うの。




Dialogを例にしてみるよ。

今まで(Fragment APIが出るまで)は、Dialogは拡張できたけど、そのライフサイクル依存な動作は、Activityに書くしかなかったよね。

えっと、onResumeで決まった動作をするDialogとか作りたくても、その部分だけは、Activityに記述するしかなかったの。

同じような処理をいろんなアクティビティでやりたければ、Activityごとに全部書かないといけなかったってこと。

これはとっても再利用しにくいよね。




で、Fragmentがあるとどうなるかっていうと。

Fragmentにもライフサイクル機能があるから、onResumeでのその決まった動作は、ActivityじゃなくてFragmentの方にかける。

ってことは、Activityにはそのコードがなくなる。つまり、Activityごとに書いてた処理が一つのFragmentに寄せられるってわけ。

ライフサイクルのプラグインって感じね。まぁ、実際コード見ると、ActivityのonResumeで、FragmentのonResumeが呼ばれているわけだけど(笑)

これで、必要なコードは一カ所にまとめられて再利用しやすくなるの。




あ、そうそう、注意点があるよ。

あくまでもこれは、Activityに寄せられてたライフサイクルの記述をFragmentと言う単位に切り出せるようになっただけ。

よくListViewがListFragmentになるように見られることがあるみたいだけど(、まぁ、それは間違っていないんだけど)、

実際には、Activityに書かれてたコードがFragmentに寄るだけで、UIをカスタマイズしたらそのコードはFragmentとは別に用意することになる。

「Activity→Fragment→View」ってなるかな。クラスはFragmentの分増えるってこと。

間違えないようにしないとね。




もう一個重要なのは、上に書いたことから、ViewがないFragmentも作れるってこと。

ライフサイクルに沿ったバックグラウンド処理とかが、Acitivityから切り離したと言う意味で再利用可能な形で作れるってことだよ。

むしろ今は、こっちの方が重要な気がする(笑)




何でかっていうと、Fragment、なんかアニメーションがおかしいんだよね。

普通に設計ミス?みたいな感じがしてるけど(笑)

一応、「Android Issue 15623」あたりでググれば出てくると思うよ♪




適当にやってきた感じをまとめると以下のような感じかなー。あくまで個人的な感覚だからね〜(゜▽、゜

1.ダイアログ表示は積極的にDialogFragmentを使うようにする。

2.ListViewはライフサイクル制御が必要なときだけFragmentにすればok無駄にFragmentにする必要はない。

3.ライフサイクルに依存したバックグラウンド処理はFragment使うといい感じ。

4.アニメーションしたいなら、Issue 15623あたりに注意する。


タグ:android
posted by すふぃあ at 14:17| Comment(1) | TrackBack(0) | 雁字

2011年04月02日

AndroidでDialog〜DialogFragmentの使い方〜

〜前置き〜

前にAndroidのDialogの使い方についての記事書いたけど、
いくつかコメントもらったりしたので、新しい情報で書いてみようかな。
ちなみに、Fragmentについては、互換パッケージを使った場合だよ。

まず、Androidの表示の仕方の基本パターンだけど3つかな。

1.Activity#onCreateDialog(int)をオーバーライドして、Activity#showDialog(int)を呼び出す。
2.Activity#onCreateDialog(int, Bundle)をオーバーライドして、Activity#showDialog(int, Bundle)を使用する。
3.DialogFragmentを継承して、FragmentActivityに表示する。

ちょっと凝ったことをしたいなら、迷わず3かな。
それぞれの特徴を、個人的な視点で書いてみるね。

1の場合:

Android1.6(API Level4)で使える。
前の記事の通り、動的なパラメーター表示関連に激しく弱い。

2の場合:

Android2.2(API Level8)から使える。
弱点は、API Levelが高すぎること。

3の場合:

互換ライブラリがあれば、Android1.6から使える。
利点は、どこでもアクティビティのライフサイクルに載せられること。
弱点は、なんか無駄にくせがあること。あとドキュメントがさっぱりなこと。

ってことで、今なら、3が便利っぽいので3でやる場合の基本とノウハウ(?っていうのかな)を書いてみる。
いつも通り基本的なのは軽く流しちゃうけどっ。

〜定義編〜

DialogFragmentは抽象クラスじゃないけど、継承して使うの。
基本は、onCreateDialogをオーバーライドすればいいかな。
onCreateViewなんかもあるけどその辺は別にどうでもいいや(マテ)。

〜使用編〜

DialogFragmentのshowメソッドを使いましょう。
おわり。

簡単だよね!(゚ー゚)(。_。)(゚-゚)(。_。)ウンウン
……というのが一般的な説明な気がする。

Fragmentじゃない時のコードからの移行も簡単だよみたいになっているけど、表面上はって感じかな。
実際にアプリ作ってる側からすると、きっつぃ。
以下は、その辺の紹介だよ。

〜動的なパラメータ〜

Bundleを渡せそうなメソッドにsetArgumentがあるから、これ使えば良さそう。Javadocでもそんな感じだし。
ただ、onPrepareDialogみたいなのがないの!onCreateDialogしかないの!
Activityの時のキャッシュみたいな機能はなくなったのかな。それっぽい解説が全くないんだよね。
一応、動作としては毎回呼ばれるみたいだけど、onCreateDialogの中でgetArgumentするってことでいいのかな。
移行用ドキュメントちゃんと作ってほしいなぁ。それともわたしが読み飛ばしちゃってるのかしら。
むー(・x・

〜キャンセルリスナー〜

onCreateDialogあたりで、作ったダイアログにリスナーを登録する。
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
  @Override public void onCancel(DialogInterface dialog) {
    // do something
  }
});

こんな感じかな。動かしてみると……、はい、普通に呼ばれないね。
移行するとこんなのでいきなり躓くし。
なんか、DialogFragment#onCancelの方をオーバーライドしないとダメっぽい。

〜複数回のdismiss〜

ちょっと複雑なProgressDialogなんかを作る場合に起こりそう、っていうか起こったんだけど、
複数回DialogFragment#dismissを呼ぶと落ちる。

サンプルコードはこんなかんじ!
this.df.dismiss();
this.df.dismiss(); // 落ちる。
落ち方はこんなかんじ
Caused by: java.lang.NullPointerException
  at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:163)
  at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:149)

う〜みゅ、そのままだね!あ、いや、別に連続して書いてはいないけどね。
複数スレッドからダイアログを閉じたいだけなんだけど……。
Dialogの時は起きないのに。まったく……(゜▽、゜
ストリームとかだって複数回closeとか出来るようにするでしょう。普通……。
というわけで?以下のようにして解決。

this.df.onDismiss(this.df.getDialog());
this.df.onDismiss(this.df.getDialog()); // 落ちない。

まぁ、詳細は、DialogFragmentのソースコードでも見てください。二つのメソッドの実装とコメントを見れば一発かな。
実装依存なコーディングだからあまり良くないんだろうだけど、互換ライブラリだし、まぁ、いいかなって。
ていうか、dismiss呼ぶので落ちるのは個人的にイヤなんだんだけど……。
onDismissの実装見る限り、わざとやってるように見えるんだけど、どうしてなのかなぁ……。

全体的にFragment作るのに忙しくて互換性がぽいぽいっとされた感じ。
ま、いつものGoogleさんっぽいけど、これからもこういう感じなんだろうね。
だいじょうぶなのかな〜いろんな意味で(笑)

タグ:android
posted by すふぃあ at 19:47| Comment(3) | TrackBack(0) | 雁字

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) | 雁字

2010年12月16日

SSHポートフォワーディングWith公開鍵方式

Empressia Tunnel(Zip版、ClickOnce版)を更新したよ。
公開鍵方式に対応したのだ!やっと!
SharpSSH(JSch)は、Poderosaで作ったSESCH(ssh.com)形式の鍵は動かないので、その分を追加で作ってたので時間がかかっちゃった。
これでポートフォワーディングとして必要な最低限の機能はそろったかなぁ。
posted by すふぃあ at 22:02| Comment(0) | TrackBack(0) | 雁字

2010年12月07日

SSHポートフォワーディングアプリ

SSHのポートフォワーディングするアプリを作ってみたよ。
名前は適当にEmpressia Tunnel。
Windows7でUI確認してるので、XPだとちょっと使いにくいかも?
XP環境がないからよくわからないけど( ̄▽ ̄;)ゞ

ClickOnce版Zip版があるよ。
Vectorにも登録完了!
Vectorの方は、Versionが少し古いから出来ればClickOnce版推奨〜☆
Windows7でUI確認してるので、XPだとちょっと使いにくいかも?
XP環境がないからよくわからないけど( ̄▽ ̄;)ゞ
あといつもの通り.NET Framework4.0なのでよろしく!

↓作った動機とかどうでもいいことが続くよ↓

VPNとか調べて、IP-VPNとかSSL-VPNとかなんか難しいのいっぱいあることがわかったのだ。
で、手軽に出来るのがSSHでのポートフォワーディング!(SSH-VPNって言うのとは別?)
ってことで、アプリを探してみたの。

そうしたら、普段よく使ってたPoderosaのプラグインであるらしいってことで、
使ってみたんだけど、うまく動かない。なんかすぐきれる。
某Pなアプリは個人的にあんまり好きじゃないので、どうしようかなーって。

で、無いなら作ればいいじゃない(゚ー゚)(。_。)(゚-゚)(。_。)ウンウン
ってことで、GranadosベースとJSchベースで悩んだんだけど、
結局、Granadosの方はうまく動かないので、JSchベースのSharpSSHを使うことにしたよ。
でも、こっちはこっちで問題があって、マルチスレッドで正しく動かないバグがアルっぽいので、
その修正版を放り込んでたりするのだ。

ちなみに、Version 1.0.0は、2こくらい不具合があるので注意〜。
Version 1.0.1で直ってるよ('-^*/

posted by すふぃあ at 12:23| Comment(0) | TrackBack(0) | 雁字

2010年11月10日

FF14無料期間終了まであとわずか

※今日はちょっとぐだぐだな長文です。ごめんなさい( ̄▽ ̄;)ゞ

うーみゅ、FF14の無料期間があと10日に迫ってきたね。
どうしようかなぁ。と思ってたら、いろいろアカウントハックとかされてるみたいね。
そのおかげで人数が減っていろいろ見えてきた気がしたよ。

ちょうどサーバーの人数が1000人前後になってきてて、
900人くらいだとゲームサーバーが割とさくさく応答するんだけど、
1100人くらいだともうダメダメに重くなるの。

この人数って、βの時の負荷テストで落ちた人数位なんだよね。
結局、この2ヶ月間+β期間、サーバー増強か何かで落ちないように強化してるんだろうけど、
根本的なパフォーマンス問題は全く解決してないってことかな。

こんなゲーム、アカウントハックなんかしてどうするんだって話もあるみたい。
でも、サービスインから、人数が半分くらいになったところに、これがあれば、
かなりFF14終了に向かって拍車がかかったんじゃないのかなぁ。
そういう意味では、効果有り?なのかな?
実際、サービスイン時3000人、最近1600人、アカウントハック後1100人。だし。
これで無料期間が切れて、12/1にモンスターハンター?が出たら、βの時より人が少なくなりそうだよね。

11月末のバージョンアップがーっていう話もあるみたいだけど、本当に大改造するなら、
それこそ、そこから一ヶ月無料期間にするべきだとおもう。
まぁ、アイテムソートとか、基礎のアルゴリズムさえ実装されてないようなのを大々的に「実装します!」とか歌う時点で無理だと思うけど。

ほんとは、βの頃にアイテム整理ボタンがあったのに無くなったんだよね。
作り忘れとかじゃなくて意図的に入れなかったわけだからね。悪意に満ちてる感じがするね。
まぁ、実装されてもきっと、不具合だらけだって言うのも見えてるし。
今の時点でアイテムを「上から○番目」って管理してる時点でもうダメ。
今は、ずれると隣のアイテムを捨ててしまうとか、別のアイテムの耐久度が反映・消耗される程度で済んでるけど……
って、あれ?これみんな知ってるよね……?
わかりやすいところだと、こんなログが出るやつね。

Sphere Xxxxは材料として「メープルの枝」を使用した。
Sphere Xxxxは「ロングボウ」を修理した。
ロングボウの耐久力が51 %回復した。
Sphere Xxxxの「装備品劣化:古品」の効果が切れた。
Sphere Xxxxは「木工」の修練値28を得た。

アイテムソートするならこういった不具合・仕様も全部直さないといけないかなっと。
これだけじゃなくて、装備の設定がずれるとか何でもありなので相当範囲は広いはず。
日本で対応してればいいけどねー(よくないけど)。
中国で対応してるときっとさらに複雑怪奇な回避コードで雁字搦めになるんだろうねー。
なってなければ、今度はほぼランダムにアイテムが捨てられたり使用されたりする、と。
既にゲームじゃないけど、もうゲームどころかアプリとしてどうなのって感じになっちゃうねw

あとは、UIの根本的な見直しだっけ?
出来るのかなぁ。アイテムソートよりこっちが重要なわけだけど、もう無理な気がする。
ごく一部って言うか、1個のケースとしてアクション選択があるわけだけど、
今は、自分が対象のアクションも、対象を選択しないアクションも、他人、味方、敵を選択するアクションも、
全部、何かをターゲットしていないとアクションの表示自体が出来ない。

他人を選択するアクションをする場合は、まずその対象を選択しないといけない(例外もあるからややこしい)。
アクション選択して、ターゲットに近づくのを待つとかは、出来ない。
自分を選択して、アクション表示しておくと、そういうアクションを選択したときには、
そのアクションは自分には出来ないよーってでる。

まとめると、
・誰かを選択。アクションを表示。アクションを選択(2次選択がないやつは対象が正しく最初に選択されていないと失敗)。
・誰かを選択。アクションを表示。アクションを選択(2次選択があるやつはまた選択しないといけない)>対象選択。
ってこと。
普通に、『馬鹿じゃないの?w』っておもう。
しかも、よく使う通常攻撃と、条件付きでシビアなタイミングが要求される攻撃が同列のパレットに並んでるので選択が大変。

これを、現在の使用感を残しつつ、大規模に書き換えなんて、無理。ほんと無理だから。
ちなみに、この使いにくさも一端なので、
前から言ってる、
・キーボードとコントローラーの操作性の不一致
・メニュー項目によるUIの操作性の不一致
・UI操作が非同期になっていない
・操作した処理が反映されない、勝手に書き換わる
・上下キー押したのに左右に移動する。あるいは移動するはずなのに移動しない。
とかも壁となって立ちはだかるし。

ほんと1から作り直した方が早いでしょ、これ。
関連したところでは、
チャット入力時にEnd押と、カーソルが一番後ろに行くと思ったら、カメラ位置が変わるって言うのがあったけど、
Homeキーはサービスイン時から実は動きが変わってます。どう変わったかは実験してもらうのがいいかな!?
もう、スクエニも把握してないでしょ。

きっと、リムサの料理ギルドのキキチュアさんの台詞がすべて(謎)

まぁ、何でここまで書いてるかって、もうやめようかなと思ってw
最近GMコールをしたら(ふれと同じ頃同じ趣旨の内容)、
フレンドのところには10分程度でチャットでの応答があったんだけど、
わたしのところにはメッセージすらこなかった。今もきてない。
他のももう1週間以上応答なし。
プレイ開始から、6時間以内に応答がきたことはなかったけど、もうダメだと思った。

EcoFF14は、一応、あと1,2回更新予定だけど、その後はどうなるかわからない。
大きく変わらないなら、このゲームは終わりだし、
大きく変わるなら、このツールは使い物にならなくなるでしょう。
どっちに大きく変わるかはわからないけどね

というわけで、無料期間終了より一足先にクールダウンを開始です(゜▽、゜
posted by すふぃあ at 23:53| Comment(0) | TrackBack(0) | 雁字

2010年10月30日

FF14のマクロをドラッグ&ドロップで入れ替え!

Eco FF14をバージョンアップして、マクロをドラッグ&ドロップで入れ替えられるようにしたよ(゜▽、゜
Version0.2.7から。
えーっと、決してドラッグ&ドロップのやり方の勉強のために作ったわけでは……。

さらに今は、Version0.2.8までバージョンアップして、キャラクター名とサーバー名を自動判別するようにしたの。
でも、自動判別性能がよくないかも……。もうちょっと精度あげたいなー。

ちなみに、ダウンロード版と、ClickOnce版(簡単インストール&自動バージョンアップ)のリンクを張っておこうφ(。。
posted by すふぃあ at 21:44| Comment(0) | TrackBack(0) | 雁字

2010年10月05日

Eco FF14を0.2.5にバージョンアップ

Eco FF14をバージョンアップ!(2010/10/07 リンク切れ修正しました)
ClickOnce版を使ってる人は自動でバージョンアップしてるかな〜。

今回はマクロジェネレーターを強化しまくり!(゜▽、゜わたし的にだけど
マクロエディタも良いんだけど、FF14製品版がログイン時にしか読み込んでくれないし、
こうなったら、FF14製品版の画面の方に書き込める様に!っていう感じ。
特にFF14製品版のメモリいじったりしてる訳じゃないから、大丈夫だと思う〜。

そんな難しいことわからないしねっ。
posted by すふぃあ at 21:00| Comment(4) | TrackBack(0) | 雁字

まだまだあるよFF14変な仕様

うーみゅ、サーバー側の負荷がちょっとだけ改善されたのかな。
アイテムを売るのが少し早くなった。遅いけど。

そしてまだまだ続く、変な仕様。他にもこんなものが!
  • 装備欄をいじりながら走る(オートラン切り替え)ことはできるんだけど、
    アイテム欄をいじりながら走る(オートラン切り替え)ことはできない。
  • 装備してるアイテムと所持品欄の対応がずれる(装備を簡単に画面操作で外せない)。
  • 製作で注文書を選択すると、製作を実行するか中止しない限り、別の注文書を選べない。
  • アクションメニューでスキルを選択しても、選択状態が元に戻されてしまうことがある。
  • フレンドリストは一方的に登録できるので、誰でも他の人のログイン状態を監視できる。
う〜ん。でんじゃらす(゜▽、゜
posted by すふぃあ at 20:54| Comment(0) | TrackBack(0) | 雁字