首页 > 代码库 > 线程与Handler(1)

线程与Handler(1)

 在Java中,线程有两种实现方式:1、继承Thread类 代表一个线程 ;2、实现Runable接口,代表一个线程体。

在Android当中也是如此。Android中的线程有两种。1、MainThread   主线程又叫UI线程;2、WorkerThread 即除主线程以外的其他线程。

若想利用线程对UI进行控制的话,一般只能通过UI线程,即MainThread(ProgressBar除外),这时对于一些可能会产生阻塞的操作,会导致应用无响应。因此必须把此类操作放置在WorkerThread当中,然而,WorkerThread中是不允许操作UI的。

此时,我们需要用到Handler处理器,使用消息机制来发送消息。

Handler的基本运行原理是Android开发当中最精妙也是最常用的设计。主要分为三个部分:1、Handler(处理器)2、Looper(循环器)3、MessageQueue(消息队列)

下面将用例子来说明。

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${packageName}.${activityClass}" >

    <Button 
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button" />

</RelativeLayout>

MainActivity.java

package com.wyb.s02_e06_handler01;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

	private Button button;
	private Handler handler;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		button = (Button)findViewById(R.id.button);
		button.setOnClickListener(new ButtonListener());
		handler = new FirstHandler();
		
		
	}
	
	class ButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			//当用户点击按钮时,我们创建一个Message对象,并用handler发送该对象
			Message msg=handler.obtainMessage();
			msg.what = 2;
			handler.sendMessage(msg);//传到handleMessage方法当中
			//上面一行代码将消息对象放置在消息队列中
			//1.Looper将会从消息队列中将消息队列取出
			//2.Looper将会找到与消息对象相应的Handler对象
			//3.Looper将会调用handler对象中的handlMessage(Message msg)方法,用于处理消息对象
		}
		
	}
	
	class FirstHandler extends Handler{
		//重写handleMessage方法
		@Override
		public void handleMessage(Message msg){
			int what = msg.what;
			System.out.println("what : "+what);
		}
	}

}

运行截图


在主界面放置一个按钮,当用户点击按钮时在控制台中输出Message对象的what的值。

流程如下:

1、定义一个FirstHandler 类继承Handler类,并重写handleMessage(Message msg)方法;

2、创建一个FirstHandler对象,并向上转型为Handler;

3、当用户点击按钮时,我们创建一个Message对象,并用handler发送该对象 Message msg=handler.obtainMessage();

4、设置msg中what的值为2;msg.what = 2;

5、将msg对象传入handleMessage方法当中 即将消息对象放置在消息队列中handler.sendMessage(msg);

6、Looper将会从消息队列中将消息队列取出

7、Looper将会找到与消息对象相应的Handler对象

8、Looper将会调用handler对象中的handleMessage(Message msg)方法,用于处理消息对象

9、调用handleMessage(Message msg)方法,执行System.out.println("what : "+what),在控制台中输出what的值。