Handler使用
3948 ワード
ネット上ではHandler理論についての解説がたくさんあります.ただ記録したいだけです.Handlerの「流水帳」を使います.
HandlerのAPIには、次のような言葉があります.
The re are two mail for a Handler:(1)to schedule message and runnables to be executed as some point in the future;and(2)to enqueue an action to be performed on a different thread than your own.
実は、ハードラーはマクロ的に見て、2つの仕事をしました.(1)スケジュールmessagesとrunnablesは将来のある時点で実行します.(2)これらのmessagesとrunnablesが実行するスレッドはどれですか?
Handlerのよく使う方法:
(1)sendMessageシリーズ:
sendMessage(Message msg):直ちにメッセージを送信します.
sendMessage Delayed(Message msg,long delayMillis):delayMillisを遅らせてメッセージを送信します.
sendEmptyMessage(int what):直ちにwhat値が指定されたメッセージを送信します.
sendEmptyMessage Delayed(int what,long delayMillis):delayMillis送信を遅らせてwhat値が指定されたmessageを送信します.
(2)オタイノテングシリーズ
Messageを送る必要があるときは、まずnewのMessageオブジェクトが出てきます.当時、AndroidはHandlerのobtainMessageを使う方法を勧めていましたが、これはより効率的です.
OB tainMessageには以下のいくつかのoverloadの方法があります.
OB tainMessage()
OB tainMessage(int what)
OB tainMessage(int what,Object obj)
OB tainMessage(int what、int arg 1、int arg 2)
OB tainMessage(int what,int arg 1,int arg 2,Object oj)
(3)また2つの重要な方法を使用する:
removeMessage(int what):メッセージ・キューから、指定値のメッセージを削除する.
removeMessages(int what,Object obj)
この方法はまだ重要です.この場合、確かにremoveメッセージが必要になります.後でメッセージを送ります.
handlerのサブクラスを継承するには、この方法が重要であり、メッセージを受信し、メッセージを取り出すためには、この方法を書き換えなければならない.
Handlerはメッセージを送ることができます.メッセージの中のarg 1とarg 2がデータの送信要求を満たしていない場合、私たちはメッセージの中にもういくつかのデータを携帯することができます.
Messageにはset Dataの方法があり、Bundeleオブジェクトを携帯することができます.私たちはBundleを知っています.たくさんのものを置くことができます.下のコードを見てください
サブスレッドでいくつかの操作を行うと、UIスレッド(つまり、メインスレッド)の一部のコントロールを更新する必要があり、または、UIスレッド内の方法を起動する必要があります.これは、Handlerを使用します.
一般的なステップは、まずメインスレッドにおいて、Handlerオブジェクトを定義し(直接メンバー変数に初期化し、次のコードを参照してください)、そして、このHandlerをサブスレッドで「見られます」限り、このHandlerにメッセージを送信すれば良いです.注意:ここでは「見ました」と言っていますが、必ずしもHandlerの例をスレッドに伝える必要はありません.
私が今使っているHandlerはこれらです.これからもっと深くまとめます.
2013220 Handler使用の深い理解
Handlerといえば、いつもThread、MessagequueとLooperと関係がありますが、これらはいったい何の関係ですか?
まずUIスレッドと非UIスレッド(自己定義)から説明します.
UIスレッド、すなわちメインスレッドは、各アプリケーションに自動的にシステムが作成され、存在すると、自分のメッセンジャーQueとLooperを所有し、自分で作成したスレッドは自動的にMessage QueとLooperを所有しなくなり、自分で導入する必要があります.(以下の説明を見てください.)
LooperはMessage Queの管理者です.各Message Queueはループから離れないで存在します.Looperオブジェクトの作成はprepare関数によって実現されます.各Looperオブジェクトはスレッドと関連しています.Looper.myLooper()を呼び出すことで、現在のスレッドのLooperオブジェクトが得られます.Looperオブジェクトを作成すると、Message Queオブジェクトが同時に作成されます.メインスレッド以外にデフォルトのLooperがありますが、他のスレッドはデフォルトではMessage Queオブジェクトがありませんので、Messageは受け付けられません.承諾が必要ならば、自分でLooperオブジェクト(prepare関数を通して)を定義して、このスレッドは自分のLooperオブジェクトとMessage Queデータ構造があります.
Thread、Message QueとLooperはグループです.Handlerはこのグループと一緒にしないと正常に動作しません.私たちは普段Handlerを使う時、Message QueとLooperに関心を持ったことがないようです.それは私たちがメインスレッドの中でHandlerを作成したのです.Message QueとLooperはすでに存在しています.
20140413
HandlerのsendMessageとdispatch Messageの違いは?
dispatch MessageはHandlerと同じスレッドで使用されています.具体的にはHandlerThread Looper.loop()のソースコードを見てもいいです.
もう一つのスレッドからHandlerのスレッドにメッセージを送り、send方式を採用する.
HandlerのAPIには、次のような言葉があります.
The re are two mail for a Handler:(1)to schedule message and runnables to be executed as some point in the future;and(2)to enqueue an action to be performed on a different thread than your own.
実は、ハードラーはマクロ的に見て、2つの仕事をしました.(1)スケジュールmessagesとrunnablesは将来のある時点で実行します.(2)これらのmessagesとrunnablesが実行するスレッドはどれですか?
Handlerのよく使う方法:
(1)sendMessageシリーズ:
sendMessage(Message msg):直ちにメッセージを送信します.
sendMessage Delayed(Message msg,long delayMillis):delayMillisを遅らせてメッセージを送信します.
sendEmptyMessage(int what):直ちにwhat値が指定されたメッセージを送信します.
sendEmptyMessage Delayed(int what,long delayMillis):delayMillis送信を遅らせてwhat値が指定されたmessageを送信します.
(2)オタイノテングシリーズ
Messageを送る必要があるときは、まずnewのMessageオブジェクトが出てきます.当時、AndroidはHandlerのobtainMessageを使う方法を勧めていましたが、これはより効率的です.
OB tainMessageには以下のいくつかのoverloadの方法があります.
OB tainMessage()
OB tainMessage(int what)
OB tainMessage(int what,Object obj)
OB tainMessage(int what、int arg 1、int arg 2)
OB tainMessage(int what,int arg 1,int arg 2,Object oj)
(3)また2つの重要な方法を使用する:
removeMessage(int what):メッセージ・キューから、指定値のメッセージを削除する.
removeMessages(int what,Object obj)
この方法はまだ重要です.この場合、確かにremoveメッセージが必要になります.後でメッセージを送ります.
handlerのサブクラスを継承するには、この方法が重要であり、メッセージを受信し、メッセージを取り出すためには、この方法を書き換えなければならない.
Handlerはメッセージを送ることができます.メッセージの中のarg 1とarg 2がデータの送信要求を満たしていない場合、私たちはメッセージの中にもういくつかのデータを携帯することができます.
Messageにはset Dataの方法があり、Bundeleオブジェクトを携帯することができます.私たちはBundleを知っています.たくさんのものを置くことができます.下のコードを見てください
Message localMessage = mHandler.obtainMessage();
localMessage.what = MediaControl.SET_VOLUME;
Bundle localBundle = new Bundle();
localBundle.putLong("getVolume", currentVolume);
localBundle.putInt("isSetVolume", isSetVolumeFlag);
localMessage.setData(localBundle);
mHandler.sendMessage(localMessage);
20140604今日はプロジェクトをして再びHandlerを使いました.サブスレッドでいくつかの操作を行うと、UIスレッド(つまり、メインスレッド)の一部のコントロールを更新する必要があり、または、UIスレッド内の方法を起動する必要があります.これは、Handlerを使用します.
一般的なステップは、まずメインスレッドにおいて、Handlerオブジェクトを定義し(直接メンバー変数に初期化し、次のコードを参照してください)、そして、このHandlerをサブスレッドで「見られます」限り、このHandlerにメッセージを送信すれば良いです.注意:ここでは「見ました」と言っていますが、必ずしもHandlerの例をスレッドに伝える必要はありません.
//
private Handler playSoundHandler = new Handler(){
public void handleMessage(Message msg) {
switch(msg.what){
case PLAY_SOUND:
playSound();
break;
}
};
};
下のコードをサブスレッドで呼び出してもいいです. playSoundHandler.sendEmptyMessage(PLAY_SOUND);
私が今使っているHandlerはこれらです.これからもっと深くまとめます.
2013220 Handler使用の深い理解
Handlerといえば、いつもThread、MessagequueとLooperと関係がありますが、これらはいったい何の関係ですか?
まずUIスレッドと非UIスレッド(自己定義)から説明します.
UIスレッド、すなわちメインスレッドは、各アプリケーションに自動的にシステムが作成され、存在すると、自分のメッセンジャーQueとLooperを所有し、自分で作成したスレッドは自動的にMessage QueとLooperを所有しなくなり、自分で導入する必要があります.(以下の説明を見てください.)
LooperはMessage Queの管理者です.各Message Queueはループから離れないで存在します.Looperオブジェクトの作成はprepare関数によって実現されます.各Looperオブジェクトはスレッドと関連しています.Looper.myLooper()を呼び出すことで、現在のスレッドのLooperオブジェクトが得られます.Looperオブジェクトを作成すると、Message Queオブジェクトが同時に作成されます.メインスレッド以外にデフォルトのLooperがありますが、他のスレッドはデフォルトではMessage Queオブジェクトがありませんので、Messageは受け付けられません.承諾が必要ならば、自分でLooperオブジェクト(prepare関数を通して)を定義して、このスレッドは自分のLooperオブジェクトとMessage Queデータ構造があります.
Thread、Message QueとLooperはグループです.Handlerはこのグループと一緒にしないと正常に動作しません.私たちは普段Handlerを使う時、Message QueとLooperに関心を持ったことがないようです.それは私たちがメインスレッドの中でHandlerを作成したのです.Message QueとLooperはすでに存在しています.
20140413
HandlerのsendMessageとdispatch Messageの違いは?
dispatch MessageはHandlerと同じスレッドで使用されています.具体的にはHandlerThread Looper.loop()のソースコードを見てもいいです.
もう一つのスレッドからHandlerのスレッドにメッセージを送り、send方式を採用する.