基于Message的线程间通信实例

在Android应用程序中,经常使用Handler进行消息处理。一般我们在当前Activity中直接新建一个Handler实例,然后重写其handleMessage方法即可。

如下所示:

	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case MESSAGE_TEST:
				System.out.println("Receive a test Message!");
				Toast.makeText(HandlerTestActivity.this,
						"Receive a test Message", Toast.LENGTH_LONG).show();
			}
		}
	};


要触发上述消息处理,只需要调用handler.sendEmptyMessage(MESSAGE_TEST);即可。
Handler类的消息处理本质上要通过Looper对象进行处理。因为主线程默认已经初始化了一个Looper对象,在主线程上创建Handler对象时,可以使用默认的Looper对象。

当我们希望在另一个非主线程上使用Handler对象时,则需要提供一个Looper对象。Android为了方便开发,已经提供了一个HandlerThread,该类在普通线程上,创建了一个Looper对象,方便我们在一个新的线程上创建Handler对象,代码如下:

final HandlerThread testThread = new HandlerThread("test thread");
		testThread.start();
		testHandler = new AnotherHandler(testThread.getLooper());

AnotherThread是我们从Handler类派生的一个子类,实现了消息处理:

class AnotherHandler extends Handler {
		
		public AnotherHandler(Looper looper) {
			super(looper);
		}
		
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case MESSAGE_TEST2:
				Toast.makeText(HandlerTestActivity.this,
						"Receive a test2 Message", Toast.LENGTH_SHORT).show();
				handler.sendEmptyMessage(MESSAGE_TEST);
			}
		}
	}

当点击界面上的一个按键时,先发送MESSAGE_TEST2,在处理MESSAGE_TEST2时,将发送MESSAGE_TEST消息,实现了主线程与非主线程间基于消息的通信。
<pre name="code" class="java">		Button btn = (Button) findViewById(R.id.test);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				testHandler.sendEmptyMessage(MESSAGE_TEST2);
			}
		});


 

你可能感兴趣的:(基于Message的线程间通信实例)