HandlerThreadはThreadを継承しているため、
インスタンスを作ると新規スレッドが生成される。
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 件のコメント:
コメントを投稿