Handler的使用

一:背景

    

    

Handler:是一个消息分发对象,进行发送和处理消息,并且其 Runnable 对象与一个线程的 MessageQueue 关联。

作用:调度消息,将一个任务切换到某个指定的线程中去执行。

为什么需要 Handler?

子线程不允许访问 UI

假若子线程允许访问 UI,则在多线程并发访问情况下,会使得 UI 控件处于不可预期的状态。

传统解决办法:加锁,但会使得UI访问逻辑变的复杂,其次降低 UI 访问的效率。

引入 Handler

采用单线程模型处理 UI 操作,通过 Handler 切换到 UI 线程,解决子线程中无法访问 UI 的问题。


二:使用


    

	private final int MESSAGE_ONE = 0x0001;
	private final int MESSAGE_TWO = 0x0002;

	private Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what){
				case MESSAGE_ONE:
					String str = (String) msg.obj;
					Log.d("Test","msg附带的参数str为" + str);
					Log.i("Test","这里可以做一些UI操作等");
					break;
				case MESSAGE_TWO:
					//...
					break;
			}
		}
	};


  在需要使用的地方:


    

	String str = "需要传过去的参数";
	Message msg = Message.obtain();
	msg.what = MESSAGE_ONE;
	msg.obj = str;
	handler.sendMessage(msg);


    另外注意的是:


    

/*1、message由handler创建,可直接向handler发送消息。msg.sendToTarget()*/
            Message msg = handler.obtainMessage();
            msg.arg1 = i;
            msg.sendToTarget();

/*2、message通过new的方式创建,可用handler.sendMessage(msg)来发送消息*/
            Message msg=new Message();
            msg.arg1=i;
            handler.sendMessage(msg);
            //直接调用 handler 的发送消息方法发送消息。

/* 3、message通过Message.obtain的方式创建,可用sendMessage(msg)来发送消息 */
           Message msg= Message.obtain();
           msg.arg1=i;
           handler.sendMessage(msg);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值