Handler:
主要用于
发送及处理
子线
程
的
Message
数据,
并用这些数据配合主线程更新UI等操作。(用
handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。
)
Handler对象与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
Message:包含消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。
Looper:
管理线程里的MessageQueue(消息队列)
,会
不断地从MessageQueue中抽取Message执行,一个MessageQueue需要一个Looper。
MessageQueue:消息队列,
将
Handler发送过来的
Message
消息
以链表的方式串联起来的
,并按照FIFO规则执行,等待Looper的抽取。
更多说明:
Android主线程 (也是UI线程)不可以放耗时操作(
联网读取数据,大文件操作等
),否则超过五秒会有无响应提示;
耗时操作需要放在子线程中进行,但
Android的
UI线程(
即
主线程
)
是线程是不安全的
,更新UI只能在主线程中更新。所以需要通过
运行在主线程中(UI线程中)的
Handler
对象与子线程间通过Message对象进行
数据
传递
,然后把这些消息放入主线程队列中,配合主线程进行更新UI。
在Android里线程分为有消息循环的线程(looper线程)和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个是Android的新概念。主线程(UI线程)就是一个
有消息循环的线程。针对这种消息循环的机制,引入一个新的机制Handler,有消息循环就要往消息循环里面发送相应的消息,自定义消息一般都会有对应的处理,消息的发送和清除,消息的处理,把这些都封装在Handler里面,注意Handler只是针对那些有Looper的线程,不管是UI线程还是子线程,只要有Looper,就可以往消息队列里面添加东西,并做相应的处理。
Handler使用:
Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用:
(1)安排消息或Runnable 在某个主线程中某个地方执行;
(2)安排一个动作在不同的线程中执行。
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新。
Handler实例:
子类需要继承Hendler类,如果是处理
Message数据,并必须要重写handleMessage(Message msg)方法。
以下为一个实例,它实现的功能为:
通过线程修改界面Button的内容
public class MyHandlerActivity extends Activity {
Button button;
MyHandler myHandler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handlertest);
button = (Button) findViewById(R。id。button);
//无参数的构造函数,默认用了本线程的looper,所以如果是在非ooper线程里要先prepare()把当前线程变为looper线程,让咱通过loop()方法启动循环
myHandler = new MyHandler();//如果在子线程中要生成主线程的可以写new Handler(Looper.getMainLooper())
//当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
//Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象 (2): 让一个动作,在不同的线程中执行。
//myHandler.post(Runnable)
//myHandler.postAtTime(Runnable,long)
//myHandler.postDelayed(Runnable,long)
//以上方法以post开头的允许你处理Runnable对象,把Runnable对象排入MessageQueue
//myHandler.sendEmptyMessage(int)
//myHandler.sendMessage(Message);
//myHandler.sendMessageAtTime(Message,long)
//myHandler.sendMessageDelayed(Message,long)
//myHandler.sendMessage()//允许你处理Message对象(Message里可以包含数据),需要重写handleMessage(Message msg)方法
MyThread m = new MyThread();
new Thread(m).start();
}
/**
* 接受消息,处理消息 ,此Handler会与当前主线程一块运行
* */
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper L) {
super(L);
}
//子类必须重写此方法,接受数据
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.d("MyHandler", "handleMessage。。。。。。");
super.handleMessage(msg);
// 此处可以更新UI
Bundle b = msg.getData();
String color = b.getString("color");
MyHandlerActivity.this.button.append(color);
}
}
class MyThread implements Runnable {
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("thread......", "mThread.....");
Message msg = new Message();
Bundle b = new Bundle();// 存放数据
b.putString("color", "我的");
msg.setData(b);
MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
}
}
}