在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的值。
线程与Handler(1)