Handler定义:
1. 负责发送和处理消息。
2. 按计划发送消息或执行某个Runnable(使用post方法).
3. 从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程).
4. 通过post发送的Runnable对象会经过包装,包装成一个Message.
5. 线程间可通过两种方式Handler进行通信:message和Runnable对象,其结果实质都是将在Handler的队列中放入内容,message是放置信息,可以传递一些参数,Handler获取这些信息并将判度如何处理,而Runnable则是直接给出处理的方法。队列就是依次执行,Handler会处理完一个消息或者执行完某个处理在进行下一步,这样不会出现多个线程同时要求进行UI处理而引发的混乱现象。
Handler构造函数:
Handler();返回当前活动线程的handler, 如果当前有多个线程则无法返回handler
Handler(Callback callback); Callback是一个接口,有handleMessage (Message msg)方法需要实现。
Handler(Looper looper);
Handler(Looper looper, Callback callback);
Handler方法:
dispatchMessage(Message msg); 见线程如何处理MessageQueue中接收的消息
obtainMessage ();从消息池中返回一个新Message
hasMessages(int what);监测消息池中是否还有what值的消息
post(Runnable r);
removeCallbacks(Runnable r);
removeMessages(int what);
sendMessage(Message msg);
线程如何处理MessageQueue中接收的消息:
在Looper的loop函数中循环取出MessageQueue的接收消息队列中的消息, 然后调用 Hander的dispatchMessage函数对消息进行处理,用户可以重写public void dispatchMessage(Message msg) 函数,控制消息处理。
Handler实例:
点击button按钮,handler发送一个消息,处理这个消息在text中显示“欢迎关注zhangflyf!”.
图示实例:
方法一:
handler发送一个message,接收到这个消息后,处理这个消息在text中显示“欢迎关注zhangflyf!”.
test3.java
package com.android.test3;
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;
import android.widget.TextView;
public class test3 extends Activity {
private Button button;
private TextView text;
private MyHandler handler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)findViewById(R.id.button);
text = (TextView)findViewById(R.id.text);
OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
//发送一个message
handler = new MyHandler();
Message msg = handler.obtainMessage();
handler.sendMessage(msg);
}
};
button.setOnClickListener(listener);
}
class MyHandler extends Handler{
public void handleMessage(Message msg) {
text.setText("欢迎关注zhangflyf!");
}
}
}
方法二:
实现runnable中run方法
test3_1.java
package com.android.test3;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class test3_1 extends Activity{
private Button button;
private TextView text;
private Handler handler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)findViewById(R.id.button);
text = (TextView)findViewById(R.id.text);
OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
handler = new Handler();
handler.post(new Runnable() {
public void run() {
text.setText("欢迎关注zhangflyf!");
}
});
}
};
button.setOnClickListener(listener);
}
}
方法三:
回调函数
test_2.java
package com.android.test3;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class test3_2 extends Activity implements OnClickListener, Callback{
private Button button;
private TextView text;
private MyHandler handler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)findViewById(R.id.button);
text = (TextView)findViewById(R.id.text);
button.setOnClickListener(this);
}
public void onClick(View v) {
handler = new MyHandler(this);
}
public boolean handleMessage(Message msg) {
text.setText("欢迎关注zhangflyf!");
return true;
}
class MyHandler extends Handler{
public MyHandler(Callback callback){
callback.handleMessage(null);
}
}
}