首页 > 编程语言 > 详细

线程通信(2)

时间:2016-01-06 16:11:59      阅读:203      评论:0      收藏:0      [点我收藏+]
消息分发
     当Message对象被发送到Handler,并尝试被处理时,Handler会对消息进行分发,即决定由谁处理消息。
    在消息机制中,可以有以下3种处理消息的方式:
        【高优先级】在创建Message对象时,调用Message类的静态方法public static Message obtain(Handler h,Runnable callback),

指定callback参数,则由callback处理消息。

public void doSendMessage(View view){
		Message msg;
		Runnable callback = new Runnable(){
			@Override
			public void run() {
                System.out.println("高优先级");				
			}
		};
		msg = Message.obtain(new Handler(),callback);
		msg.sendToTarget();
	}

【中优先级】在创建Handler对象时,调用public Handler(Callback callback)构造方法,指定callback,将由Handler.Callback接口中
定义的public boolean handleMessage(Message msg)方法处理消息。

     private Handler handler;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		handler = new Handler(new InnerHandlerCallback());
	}
	
	private class InnerHandlerCallback implements Handler.Callback{

		@Override
		public boolean handleMessage(Message msg) {
            System.out.println("中优先级");			
			return false;
		}
		
	}
	public void doSendMessage(View view){
		Message msg;
		Runnable callback = new Runnable(){
			@Override
			public void run() {
                System.out.println("高优先级");				
			}
		};
		msg = Message.obtain(handler);
		msg.sendToTarget();
	}

【低优先级】自定义类继承Handler类,创建自定义的Handler对象,并在自定义类中
重写public void handleMessage(Message msg)方法,由重写的方法处理消息。
线程通信模型
          由于向目标线程发送消息的线程可能比较多,为了确保目标线程
 能收到这些消息,并逐一处理,在消息机制中,存在4种角色:
       Message:消息的载体
Handler:发送消息、处理消息
MessageQueue:消息队列
Looper:消息队列的管理者
     Handler用于执行消息的发出和处理
     Handler关联一个独立的线程及消息队列,即Handler在哪个线程创建,则绑定到哪个
     线程的消息队列。
     MessageQueue是Message的容器,它是一个先进先出、后进后出的队列;
     任何Message在被发出后,都会被先放到MessageQueue中,然后逐一的发送给目标。
     Looper是MessageQueue的管理者
     当Message被发出后,由Looper关联的MessageQueue.IdleHandler将其添加到MessageQueue中
     Looper在工作时,会循环读取MessageQueue,然后实现消息的发送
     MessageQueue是由Looper实现管理,英雌,开发人员无需对它进行处理
     Handler的创建线程决定了他所在的线程,则处理对应线程中收到的消息
     每个线程都可以有独立的Looper,由各个Looper管理各个线程的消息队列
     Looper必须调用prepare()系列方法进行初始化,然后在调用loop()方法才会开始工作
     每个Handler在初始化之前,对应的线程中必须有匹配的Looepr,而主线程默认即存在已经启动的Looper

线程通信(2)

原文:http://blog.csdn.net/wojiaohuangyu/article/details/50468484

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!