在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的值。