Android/tumami

Last-modified: 2010-10-22 (金) 15:24:52

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の戻り値である。