と言っても公開するための物ではありません。あしからず。
いろいろなテストを行うため+自分のスキルアップのために作ってみました。
熱中しすぎたためにNTT docomoが発表会をやっていたとか完全に見逃してしまいましたのでこれは記事にしません。
開発環境があったのに今までサンプルでさえまともに作っていなかったですからね・・・。
Javaが今回が初めて
一応プログラマですのでいろんなプログラミング言語を使ったことがありますが、Javaを本格的に使うのはこれが初めてです。
オブジェクト指向の言語と言うことでC++と類似していることがいくつかある、と言うだけの認識で組み始めています。
これで使えるようになればまた言語が増えるのですね。主要な言語を一通りやったことになりそうな気がするのはたぶん気のせいではないです。
使ったことがある言語順としては(C,C++,Perl,Z80,x86asm,PHP,JavaScript,VBA,C#,Objective-C,Javaという感じ?)
クロージャーは並みの・・・のギャグは置いておいて
Javaでのイベント処理は基本的にリスナ経由で行う、と言うことは知っていたのですが、そうなると、リスナをカバーするために大量の子クラスが必要になるのでは?と思っていました。
作ってみると納得。子クラスの代わりにクロージャーを大量投入することになるのですね・・・。
というか、リスナ+クロージャーが事実上C++での関数ポインタ(delegete)のような扱いになるというのが驚きでした。
クロージャーを使える言語がだいぶ増えていますが、まともにクロージャーとして使ったのはたぶん初めてだと思います。
かなりおもしろい機構ですが、使う分には不要なクラスが増えないのでいいのですが、解析する分には大変だろうと。
AndroidでGUIの処理をする部分は固めてしまう必要が
というよりも、いろいろなところで書いてありますが、「AndroidのGUI処理はメインスレッドから呼び出されることを前提として作られている」ことがいろいろと問題になります。
なので、GUIに対する状態変更を要求するときにはHandlerを使ってメインループに処理依頼を行うのが一般的なやり方のようです。
大きなアプリを組むときはGUI部と動作部を分けてしまい、GUI部にはHandler経由で呼び出す形がわかりやすいのかもしれません。
あと、Threadクラスでスレッドを作ったときにその中からHandlerを呼び出すときにはメインループを取得してメインループ側に発行しないとランタイムエラーになるというのも分かりました。
このあたりの作法などはさすがに簡単な解説本とかには書いていないですからね・・・。
GPSをエミュレータ上でテストするときは動作セットに要注意
通常、Androidアプリの作成やエミュレーターの動作セットはAndroid (2.3.3)など標準のターゲットを使うことになります。
が、どうもこれらで動作させているとGPSのエミュレーション時にエミュレータが落ちてしまう(再起動する)ということが起こるようです。
アプリの権限やらエミュレータ制御でGPSの位置情報をエミュレータに通知すると言うところまでは気がついてもこれはさすがに気がつかないですよ。
で、GPSをエミュレータで使用するときのポイントは(開発環境としてEclipseを使っている場合を例として)
- アプリにGPSの権限を与える (android.permission.ACCESS_FINE_LOCATIONなど)
- エミュレータにGPS取得の権限を与える (ハードウェアのプロパティにGPS Supportを追加して「yes」にすること)
- プロジェクトビルドターゲットをAndroidから同じAPIレベルのGoogleAPIに変更する (GoogleAPIが無い場合はAndroid SDKマネージャでダウンロードすること。プロジェクトビルドターゲットは[プロジェクト]=>[プロパティ]=>[Android]にある)
- エミュレータのターゲットもAndroidから同じAPIレベルのGoogleAPIに変更する ([AVDマネージャ]=>[編集]=>[ターゲット]で変更可)
- エミュレータが起動した後でエミュレータ制御のウィンドウを開く。([ウィンドウ]=>[ビューの表示]=>[その他]から開ける)通知が失敗するときはJava編集画面ではなくデバッグ画面にしてやってみること
という面倒な手順がいることが分かりました。
ここまで調べるのも一苦労でしたね。引っかかっている人がどのくらいいたのやら・・・。
次にADVシステムを作るときにはスマートフォン版を先に作ってそれをPCに移植する方が作りやすい?
ちょっと考えてしまいました。どうせ向こう数年くらいはスマートフォンを使ったADVシステム開発がいろいろな場所で行われると思いますので、
そうなってくるとPC版をスマートフォンに無理に移植するよりは先にスマートフォン版を作りやすい形で作った上でPC版に移植した方が
PC版側ならだいたいの無理が効く(プログラミング言語的にも速度的にも)ので有利では?と考えてしまった当人です。
おもしろい発想かもしれないな~と思いながら。