1,msg 依赖的包
import android.content.Context;
import android.os.Handler;import android.os.HandlerThread;
import android.os.Message;
2,Handler的对象获取
private
Handler mHandlerMsg = null;
mHandlerMsg = new Handler(mcontext.getMainLooper()) {
@Override public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_EPG_SECTION_FOUND:
break;
default:
break;
}
}
};
其中 参数mcontext.getMainLooper()在当前activity下是不需要的;
3,消息的发送
消息的发送有三种方式,一种是没有参数直接发送;方法如下:
mHandlerMsg.sendEmptyMessage(MSG_EPG_SECTION_FOUND);
第二种是带参数发送,方法如下:
{
Message msgtime = new Message();
msgtime.what = MSG_EPG_TIME_UPDATE;
msgtime.arg1 = msg.arg1;
msgtime.arg2 = msg.arg1;
msgtime.obj = msg.obj;
mHandlerMsg.sendMessage(msgtime);
}
第三种方法是内部构建对象的方式,参数默认为msg.obj,obtainmessage()是从消息池中拿来一个msg 不需要另开辟空间new。这种方法Message msg 对象可以复用。如果没有就会创建一个Message msg,有的话就用已创建好的。
(1)单个obj
{
mHandlerMsg.obtainMessage(MSG_EPG_SECTION_FOUND, mChannelUri).sendToTarget();
}
{
Uri muri = (Uri)msg.obj);
(2)嵌套多个obj
{
SomeArgs args = SomeArgs.obtain();
args.arg1 = channel;
args.arg2 = cb;
args.arg3 = inputId;
mHandlerMsg.obtainMessage(MSG_EPG_SECTION_FOUND, args).sendToTarget();
}
对应的消息处理如下:
{
SomeArgs args = (SomeArgs) msg.obj;
InputChannel channel = (InputChannel) args.arg1;
ITvInputSessionCallback cb = (ITvInputSessionCallback) args.arg2;
String inputId = (String) args.arg3;
}
(3)直接内部产生obj
{
mHandlerMsg.obtainMessage(MSG_EPG_TIME_UPDATE, (int)(volume * 100), 0, null).sendToTarget();
}
相当于
{
Message msgtime = new Message();
msgtime.what = MSG_EPG_TIME_UPDATE;
msgtime.arg1 = (volume * 100);
msgtime.arg2 = 0;
msgtime.obj = null;
mHandlerMsg.sendMessage(msgtime);
}
4,延迟发送消息的方法
mHandlerMsg。sendMessageDelayed(msg1, 1000);
单位为ms;
5,清楚队列消息
mHandlerMsg.removeMessages(MSG_EPG_TIME_UPDATE);
6,线程实现handler msg的方法
final HandlerThread mHandlerThread = new HandlerThread("LooperThread");
mHandlerThread.start();
final Handler mHandler = new Handler(mHandlerThread.getLooper()){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Log.w("LooperThread", "handleMessage::Thread id---" + mHandlerThread.getId());
}
};