携帯アプリにおけるマルチスレッディング
携帯は、アプリの容量制限がきついので、出来る限り容量を少なくするようにコーディングする必要がありますけど、その方法の一つとして、クラスの数を減らすというのがあります。
自分の場合は基本的に、IApplicationやMIDletクラスを継承した実行クラス、Canvasを継承したライブラリクラス、ライブラリクラスを継承したメインクラスの3つのクラスしか作らないようにしています。
もし、容量がきつくなってきたら、メインクラスの中身を全てライブラリクラスに放り込みます。
メインクラスはライブラリクラスを継承しているので、やろうと思えば簡単に1つにまとめられるのです。
そして、問題としているのはマルチスレッドで処理をしたくなった場合にクラスを増やしてしまうこと。
例えば、振動させるメソッドを作る場合、DoCoMoとVodafoneの振動はON/OFFしかない(auはミリ秒を指定すれば勝手に振動してくれる)ので、毎ループ振動した時間をチェックするような形になってしまうと思います。
もし振動を100msでONにして、状態をチェックするまでの間に1秒間あった場合、1秒間以上振動を続けることになり、困ってしまいます。
なのでこいつを別スレッドにしたいと思います。
しかし、こいつを別スレッドで処理した場合、
class Vibrator implements Runnable{ static Vibrator v = null; static void vibrate( int time ){ if( v == null ){ Vibrator v = new Vibrator(); } v.set( time ); Thread th = new Thread( v ); th.start(); } private int _time; void set( int time ){ _time = time; } void run(){ // 振動ON onVibrate(); Thread.sleep( _time ); // 振動OFF offVibrate(); } }
こんな感じになります。
まあ、これだと振動中にもう一度振動が呼ばれたときの処理とかその辺が全く出来ていないので全然ダメダメですが、問題としてるのはそこじゃないので省略。
ここで問題としているのは、これを作る為に新しいクラスを作っていることです。
こんなちょっと振動させるだけのクラスの為だけに、わざわざ新しいクラスなんか作りたくありません。
なんとかならないかと考えた末、次のようにしました。
class Library extends Canvas implements Runnable{ void vibrate( int time ){ _time = time; _thread = 1; Thread th = new Thread( this ); th.start(); } private int _time; void run(){ switch( _thread ){ case 0: // 通常処理 break; case 1: // 振動ON onVibrate(); Thread.sleep( _time ); // 振動OFF offVibrate(); break; } } }
ライブラリクラスのRunnableを利用してやります。
いつも書いている処理と分けてやって、そこで実行してやります。
そうすれば、わざわざ別のクラスにする必要が無くなるのです。
まあ、OOP的にはどうかと思いますがそんなの気にしてられないので(;´Д`)