ちゃんと(?)組むとどうなる?

  • 投稿日:
  • by
  • カテゴリ:

image

App Inventor で、ちょいちょいと、ストップウォッチを作りました。さて、じゃあ、それを、Eclipse + Android SDKという、標準的な組み合わせで実装したら、どんな塩梅なんでしょう?

Activityだとか、スレッドだとか、結構泥臭いことを意識しないと、書けないので、こちらは、まあ、それなりにプログラミングの知識が必要になります。あと、デバッガ+エミュレータが非常に重たいので、ワタシの、VAIO TypeGでは、ストップウォッチのデバッグは無理でした。

それはさておき、折角SDKを使うのだから、App Inventorよりは凝った作りにしたいです。いや、単に、時間の表示や、Lap timeのリストにうっかり触って、キーボードがポップアップしたりしないとか、Lap timeがリストになっているとか、そんな程度なんですけれどね。

厄介なのは、タイマーを使った periodical な処理です。Androidでは、Timerは、指定した処理を一定間隔で実行はしてくれますが、これが、別スレッドでの処理になります。

一方で、GUIの操作は、メインの Activity を実行しているスレッドが排他的に行なうことになっているので、うっかり、呼び出された処理の中で、画面の時計を書き換えようものなら例外で死ぬのです。

もちろん、そのような事態を避けるために、描画処理を、メインスレッドへキューイングして処理させることができるんですけれどね、こんな感じで。

timer = new Timer();
final Handler handler = new Handler();
timer.schedule(new TimerTask(){
    @Override
    public void run()
    {
        handler.post(new Runnable(){
            public void run()
            {
                SimpleStopWatch.showTime();
            }
        });
    }
}, delay, delay);

 

こういった泥くさーいコードを書いてやれば、こんな具合に、ストップウォッチの出来上がり、と、なるわけです。

機能に制限があるとはいえ、マルチスレッド周りのあれこれを考えないでいい、App Inventorは、それなりに使い道があるやもしれない……と、ちょっと思いました。まあ、本当に、できることとのバランスになりますけれど。