Handler作为Android项目中一个很重要的使用工具,基本项目中都能使用到,主要用于多线程编程。
例如在子线程使用Handler发送消息在主线程中更新UI,还可以用于延时、循环等。并没有深入的讲解。
转载请注明:http://blog.csdn.net/zou_pl/article/details/63253530
- Handler使用的小例子
- Handler原理解析
Handler使用中技巧
Handler使用的小例子
首先看一个Handler使用的小例子:点击一个Button,启动一个线程,然后线程中发送消息到主线程中更新UI。
public class Test extends Activity {
private static final int MSG_BUTTON_CLICKED = 1;
public Button mButton = null;
//新建一个Handler的时候,使用new Handler(Looper.getMainLooper()),确保在主线程中执行
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_BUTTON_CLICKED :
//接收到消息,在主线程中更新UI,例如隐藏对话框之类的
hideDialog();
break;
default:
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//对Button设置点击事件
mButton = (Button)findViewById(R.id.live_play_button);
mButton.setOnKeyListener(mOnKeyListener);
}
private View.OnClickListener mClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击Button的时候,新开一个线程,这个线程为子线程,不能在子线程中更新UI
new Thread(new Runnable() {
@Override
public void run() {
//子线程中使用Handler发送一个消息出去,在Handler中接收并且处理这个消息
Message msg = new Message();
msg.what = MSG_BUTTON_CLICKED;
mHandler.sendMessage(msg);
//或者是下面的方法
//mHandler.sendEmpty(MSG_BUTTON_CLICKED);
}
}).start();
};
}
上面就是一个简单的例子,Handler如何使用及其大概的流程应该是清楚的。
备注一下,上面的小例子是一个字一个字码出来的,并没有在编译器中严格编程,只是作为一个介绍的小例子,介绍其流程。
## Handler原理解析##
非UI线程不允许操作UI的意思是:在非UI线程中不允许访问来自 android.widget 和 android.view 软件包的组件。
Handler的使用中,需要搞清楚四个组成部分,分别为Handler、Message、MessageQueue、Looper。
Handler是用来发送接收消息,Handler一般使用sendEmptyMessage(int)发送一个int数值的空消息、sendEmptyMessageDelayed(int,delay)延时delay毫秒发送一个int数值、sendMessage(msg)发送一个消息体、sendEmptyMessageDelayed(msg,delay)延时发送一个消息体,Handler在新建Handler时重写的public void handleMessage(Message msg) {..}发送中处理消息;
Message是多线程之间沟通的载体,带有需要交互的信息;
MessageQueue是由很多消息组成的消息队列,先进先出原则;
Looper是消息管家,调用Looper的loop()方法之后,就会进入一个无限循环之中,当发小MessageQueue中有消息时,就会将消息取出交给Handler的handleMessage()进行处理。
每个线程中会有很多很多不同的Message,他们组成了一个MessageQueue,然后Looper对这些Message进行管理,交由Handler处理。