miyabihitoの日記

個人的な技術メモ

Handler Message

Handlerクラス
内部に持っているキューを扱うことができる。
AndroidGUIは、GUIを扱うスレッドからしか操作できないため(シングルスレッドモデル)
他のスレッドから画面を操作したい場合は、Handlerにキューイングして実現する。
注意:Handlerクラスは、メインスレッドでなく、別スレッドでインスタンス化するとFatal Error

メソッド
post(Runnable):Runnableインタフェースを受け取り、キューに溜めGUIスレッドで実行される。
注意点: postの中で、sleep処理は使えない。postの前後でsleppするべき。
handleMessage(Message):キューのメッセージを処理する(GUIスレッドに記述する)
以下のメソッドは、handleMessgaeメソッドを呼び出す。
sendMessage(Message):Messageオブジェクトをキューイングする(自作スレッドに記述する)
sendEmptyMessage(int):引数をMessageオブジェクトのwhatプロパティとして渡す。

上記3つのメソッドにはそれぞれエンキューを遅らせるメソッドと
指定時間になったらエンキューするメソッドがある。

postDelayed(Runnable, Mills)
postAtTime(Runnable, Mills)
指定は、ミリ秒単位

removeCallbacks(Runnbale)
キューのRunnableを削除
removeMessages(what)
指定されたwhatを持つメッセージの削除


Messageクラス
生成
Handler.obtainMessageメソッドによる取得の方が効率がいいらしい。
(global message poolとか言う所から取ってくる)(Handlerがセットされている?)
また、オブジェクトの取得と下記プロパティのセットを同時に行える。

Message.obtainメソッドも同上(引数なしはHandlerがセットされていない?)

public プロパティ(値をセットして、情報の受け渡しに使える)
int what:メッセージの識別用
int arg1
int arg2
Object obj
メソッド
setData(Bundle):
Bundle getData():

Bundleクラス
キーと値を保持する。
putString(key, value)
getInt(key)
等等
(ActivityのonSaveInstanceState()メソッド等でも用いる)

Handler | Android Developers
Message | Android Developers