复习四,Handler消息机制

Android规定只能在UI线程(即主线程)更新UI,所以Handler是一种基于消息机制的使用子线程提醒更新UI的机制。
而常与Handler一起工作的几个组件:

1 Massage

用于存放消息的对象,是主线程和子线程传递数据的载体。
arg1和arg2: 使用这两个字段来存放我们需要传递的整型值,在Servie中,可以用来存放Service ID;
obj: 该字段式Object类型,可以让该字段传递到某个多项消息的接收者中。
what: 这个字段可以说式消息的标志,在消息处理中,我们可以根据这个字段的不同的值进行不同的处理。

初始化: 三种方式

Message message = new Message();
Message message = Message.obtain();
Message message = handler.obtainMessage();

向Message中添加数据:

Message message = Message.obtain();
// 将传递数据,封装到Message消息对象中
message.what = 0;
message.arg1 = 1;
message.arg2 = 2;
message.obj = " 传递的内容"
Bundle.bundle = new Bundle();
bundle.putString("name","张三");
message.setDate(bundle);

从Message中取出的数据

private Handler handler =new Handler(){
	 @Override
	 public void handleMessage(Message mag){
	 super.handleMessage(msg);
	 int flag1 = msg.what;
	 int flag2 = msg.arg1;
	 int flag3 = msg.arg2;
	 String resultMsg = (String) msg.obj;
	 Bundle bundle = msg.getData();
	 String name = Bundle.getString("name");
	 }
};
MessageQueue

消息队列,采用先进先出的方式管理Message。程序创建Looper对象时,会在它的构造器中创建MessageQueue对象。MessageQueue以链表方式将Message对象串联起来,由于一个线程至多只能有一个Looper,所以一个线程也只能有一个MessageQueue。通过Looper.myQueue()获取当前线程中的MessageQueue。
Looper构造器源码:

private Looper(){
	mQueue = new MessageQueue();
	mRun = ture;
	mThread = Thread.currentThread();
}
Looper

MessageQueue的管理者,Android主线程有默认的Looper对象,其他子线程通过Looper.preare()创建Looper。
prepare()方法源码:

public static final void paperpare(){
	if(sThreadLocal.get()!=null)
	{
		thow new RuntiomeException("Only one Looper may be created per thread");
	}
	sThreadLocal.set(new Looper);
}

倘若线程存在Looper对象,则可以通过Looper.myLooper()获取,此外还可以通过Looper.getMainLooper()获取当前应用系统中主线程的Looper对象。
我们通过loop()方法来启动它。loop()方法使用一个死循环不断取出MessageQueue中的消息,并将取出的消息交给该消息对应的Handler进行处理。

Handler

Handler类的主要作用有两个。
1.在新启动的线程中发送消息,
2.在主线程中获取消息,
Handler类包含如下方法发送处理消息。

方法作用
handlerMessage(Message msg)处理方法的消息,该方法通常会被重写
hasMessage(int what)检查消息队列中是否包含what字段为指定值的消息
hasMessage(int what,Object Object)检查消息队列中是否包含what字段为指定值且object属性为指定对象的消息
obtainMessage()获取消息,具有多个重载方法
sendEmptyMessage(int what)发送空消息
sendEmptyMessageDelayed(int what,long delayMillis)指定多少毫秒之后发送消息
sendMessage(Message msg)立即发送一条消息
sendMessageDelayed(Message msg,long delayMillis)指定多少毫秒后发送消息

Handler能把消息发送给Looper管理的MessageQueue,并负责处理Looper分给他的消息。

在线程中使用Handler

1,调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象时,它的构造器会创建与之配套的MessageQueue。
2,有了Looper之后,创建Handler子类的实例,重写handleMessage方法,该方法负责处理来自其他线程的消息。
3,调用Looper的loop()方法启动Looper。

PS:使用静态内部类构造handler对象,防止其隐式的持有外部activity的引用,造成内存泄漏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值