新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

どうやると Android の処理がきれいにかけるか?

まずは GUI と処理を分離すること。なので、ハッカーな人は GUI から作り始めない。コアのロジックを作るべき。コアのロジックは CUI でコントロールできるようにすべきだ。一般的には BaseClass があり、それを発生させた Script 用のクラスができ、BaseClass を発生させた GUI のもう一つのクラスができるはずだ。

TCP/IP を使うなら(よくあるのだが)、まいどだが recv full のようなものを実装すべき。ついでに、receiver 用のスレッドも必要になるだろう。receiver 用のスレッドは callback ルーチンを登録できるようにしておき、処理を柔軟にかつ reply を無視できる構造にしておく。read したまま帰ってこなくなることがあるようなので、(android の古いバージョンは read している socket が close しても処理が終わらない!!)プロトコル上はきれいに quit などの reply を入れた方がいい。callback も一度だけの登録と永久登録を両方できるとなおよい。

できれば read で待っている間に keep alive のパケットを timer などで定期的に投げた方がより良い。read したまま、たとえば、物理的な線が切れても TCP/IP はわからない。しかし、send して ack が返ってこなければその socket は OS によって強制的に close される。そこで、read も通常はエラーになる。何度も言うようだが、android の古いバージョンは read している socket が close しても処理が終わらない!!ので、本格的に対応しようとすると、available であることを確認して sleep で寝るとかを繰り返す必要がある。ひどいね。

コアのロジックは、Service という機能を使って実現することができる。Service はどうも GUI とロジックを分離させるためにあったような気がする。しかし、中途半端なために今、一つ使えない。Service をつかっても Application などのような class を一つ作って集中管理させても基本的には同じだ。後者の方が簡単でわかりやすいかもしれない。要は、複数のActivity にまたがって状態などを保存しておく領域とそれに応じて変わる処理のセットが必要なのだ。GUI に埋め込むと融通が利かなくなるので注意。

GUI は Intent により通知されると変化するように作ったほうがよい。Activity がおわって親のActivity にもどるときは簡単だ。親の Activity で戻り値としての Intent をとらえてロジックに変更等を通知すればよい。

Thread などから callback ルーチンを使うときも Intent を使って呼ぶとそれを待っている人すべてに配布されるので便利だ。この Intent の延長の関数は Thread が実行することに注意。つまり Activity とは競合する。

Thread -> サービスのあるルーチンを呼ぶ -> Intent が発行される -> その延長で Activity などの onReceive が呼ばれる。

最初

Thread -> Intent を発行する -> Service が Intent を受けて実行 -> Activity のメソッドを呼ぶ。

とかしていたが、Service が Thread ではないことがわかり、破たんした。(GUI を変更するのに Service がいったんうける意味がない)

厳密にやろうと思うと

Thread -> Intennt を発行 -> Service が Intent を受けて内部状態を変える -> 同時に Activity も Intent を受けて内部状態を変える。

ちょっとショートカットをするなら

Thread -> Service のメソッドを実行して直接内部状態を変えると同時に Intent を発行 -> Activity も Intent を受けて内部状態を変える。

もともと Activity は Service を探して直接 Service のメソッドを呼ぶ。したがって、Thread も Service のメソッドをつかって直接内部状態を変えてよい。Thread が Activity のメソッドを呼んで内部状態を変えることも基本的には問題ない。ただし、その場合、Thread と Activity は見つけ結合になってしまう。Activity は GUI をつかさどるわけで、なにか外部的なあるいイベントが来たことによって、見た目などが変更されると考えた方がすっきりする。同じように見えるけどちょっと違う。