Study-android 的handler和message学习

主要看代码:

/**
 * 
 * 关于handler、message、MessageQueue、looper
 * 1、一个线程Thread只有一个Looper,这个Looper不是默认有的,需要通过调用Looper.prepare();
 * 和Looper.loop();启动和初始化,Activity默认是有一个Looper,所以不需要调用prepare和loop
 * 
 * 2、handler会绑定一个线程,在那个线程里面实例化则绑定那个线程,handler是用来发送和接受消息的
 * handler可以发送和接受多个消息,Looper是管理handler message机制的
 * 
 * 3、message是通过handler来操作的,可以handler主动来发送,也可以是message设置handler来发送
 * 获取message的最好办法是Message.obtain()或者Handler.obtainMessage()
 * 
 * 4、post和sendMessage 在handler里面覆盖sendMessage方法来处理message
 * post里面的runable是跟handler实现的位置是同一个线程
 * 
 * @author WangYD
 * @time 2015年8月6日
 * 
 */

public class HandlerActivity extends Activity implements OnClickListener {
	private static final String TAG = "HandlerActivity";

	private Button btn1 = null;
	private Button btn2 = null;

	/**
	 * 这个handler是在main里面实例化,所以这个是被main线程的Looper管理,可以处理从子线程里由这个handler发送的消息
	 * 如果handler是在子线程里面实例化(可以在main里面声明),则这个handler是由子线程的Looper管理,
	 * 可以处理从main线程里由这个handler发送的消息main里面的Looper是系统自动产生的,
	 * 但是子线程的Looper需要通过调用Looper.prepare()和Looper.loop()来产生初始化Looper
	 */
	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			DBG.log(TAG, "main:" + msg.obj.toString());
		}
	};

	/** 这个在子线程里面实例化 */
	private Handler handler2 = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_handler);
		btn1 = (Button) findViewById(R.id.a_button1);
		btn2 = (Button) findViewById(R.id.a_button2);
		btn1.setOnClickListener(this);
		btn2.setOnClickListener(this);

		new Thread() {
			@SuppressLint("HandlerLeak")
			public void run() {
				Looper.prepare();
				handler2 = new Handler() {
					@Override
					public void handleMessage(Message msg) {
						DBG.log(TAG, "thread:" + msg.obj.toString());
					}
				};
				Looper.loop();
			}
		}.start();

		DBG.log(TAG, "Begin Post");

		/** 等待handler2初始化完成 */
		while (handler2 == null)
			;

		/**
		 * 这个runable跟调用的handler初始的线程是同一个线程 , 使用handler的时候要等到run完成才出现按键
		 * 使用handler2的时候,按键是很快就出现了
		 */
		handler2.post(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 9; i++) {
					DBG.log(TAG, "run");
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}

			}
		});
		DBG.log(TAG, "After Post");

	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.a_button1:
			new Thread() {
				public void run() {
					handler.obtainMessage(0, "Hello Wangyidong").sendToTarget();

				};
			}.start();
			break;
		case R.id.a_button2:
			handler2.obtainMessage(0, "Hello World").sendToTarget();
			break;
		}

	}

}


源码下载:http://download.csdn.net/detail/yidong_wang/8975697




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值