Handlerのスレッドを用いると、UIの操作が可能である理由
(通常、Androidは、メインスレッド以外からはUIを操作できないようになっている)
内部で以下のような処理を行っているため。
1.Handler.post()は引数のRunnableをMessageに変換して、MessageQueueに登録する 2.UI Threadで実行されているLooper.loop()がMessageQueueに登録されたMessageを取り出し、実行する
つまり、最終的なrunはUI Threadによって実行されるように隠蔽されている。
良くない通信アプリの例
ボタンをクリックするとWeb上の画像を拾ってきて描画する例
public void onClick(View v) { Bitmap b = loadImageFromNetwork(); mImageView.setImageBitmap(b); }
これは正常に動作するが、良くない。
画像をダウンロードして描画するまで、ユーザ操作を一切受け付けない。ユーザはストレスの塊。
このような処理をユーザーにストレス無く提供するにはマルチスレッドは必須。
Handlerでマルチスレッドを行うとよい。
Handler以外のマルチスレッド方法
Handlerはコードが読みづらくなるので、
AsyncTaskというのがSDK1.5からサポートされた。
これは、独自スレッドとmainスレッドが同居したAPIである。
1.(クラス名)extends AsyncTaskを定義し、
2.doInBackgroundメソッド内に独自スレッドで バックグラウンド実行したい処理を記述
3.onPostExecuteメソッド内に画面描画できるmainスレッドで 実行したい処理を記述
これだけで、
独自スレッドのバックグラウンド処理⇒処理終了⇒mainスレッド実行という一連の流れをサポートしてくれる。
そして、実行する際には、
new (クラス名).execute(args);
とするだけ。argsはdoInBackgroundの引数として渡される。
onPostExecuteの引数は、doInBackgroundの戻り値である。