2010年8月12日木曜日

HandlerThread・Handler・Messageの使い方

1. 新規スレッドでLooperのメッセージループを開始

HandlerThreadThreadを継承しているため、
インスタンスを作ると新規スレッドが生成される。

HandlerThread.run()はオーバーライドされており、
Looperを使用してメッセージキューの生成→メッセージループの実行を行っている。

そのため、HandlerThread.start()でメッセージループが開始される。

2. Looperを関連付けたHandlerの生成

new Handler(HandlerThread.getLooper()) で、Looperのメッセージキューを使用するHandlerを生成する。
同一Looperに対して、Handlerは複数生成可能。

1~2のシーケンス図


3. Handlerに関連付いたMessageの生成

Handlerに関連付いたMessageを生成する (Message.obtain())。
Handlerは新規スレッドに関連付いているため、このMessageも別スレッドで処理される。
※Messageは処理後にLooper.loopでrecycle()されるため、ユーザーはrecycle()しない。

Messageの処理フローは、以下のような感じ。
if(Message.Runnable != null)
{
    //MessageにRunnableが関連付いていれば、Runnableを実行
    call Message.Runnable();
    return;
 }
 else
 {
    //HandlerにCallbackが関連付いていれば、Callbackを実行
    if(Handler.Callback != null && (call Handler.Callback()) == false)
    {
        //HandlerにCallbackが関連付いていない or Callbackの戻り値がfalseなら、
        //Handler.handleMessageを実行
        call Handler.handleMessage();
    }
 }
3のシーケンス図

0 件のコメント:

コメントを投稿