Handler
(Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息)
handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
它有两个作用:
(1):安排消息或Runnable在某个主线程中某个地方执行;
(2):安排一个动作在不同的线程中执行
一个线程怎样把消息放入主线程的消息队列呢?
只要Handler对象以主线程的Looper创建,那么调用Handler的sendMessage等接口,将会把消息放入队列都将是放入主线程的消息队列。并且将会在Handler主线程中调用该handler的handleMessage接口来处理消息。
相关对象的解释
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。
MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。
Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。
Thread:线程,负责调度整个消息循环,即消息循环的执行场所。
相关流程图片:
Handler的post(r)方法和Handler的sendMessage方法
博客一:
一般来说在工作线程中执行耗时任务,当任务完成时,会返回UI线程,一般是更新UI。这时有两种方法可以达到目的。
一种是handler.sendMessage。发一个消息,再根据消息,执行相关任务代码。
另一种是handler.post(r)。r是要执行的任务代码。意思就是说r的代码实际是在UI线程执行的。可以写更新UI的代码。(工作线程是不能更新UI的)
博客二:
Handler.post()方法
消息发送代码:
在属性中声明
Handler handler=new Handler();
在非主线程中调用
handler.post(new Runnable(){
@Override
public void run() {
//do something to Update UI
}});
还有两种消息发送代码(仅供参考)
(1)
Message msg = new Message();
msg.what =1;
handler.sendMessage(msg);
(2)
Message msg = new Message();
msg.what =2;
msg.obj = bm;
handler.sendMessage(msg);
(3)
Message msg = new Message();
Bundle data = new Bundle();
data.putString("text", "正在下载...");
msg.what = 3;
msg.setData(data);
handler.sendMessage(msg);
*******************************************************************************
Handler.sendMessage方法
消息处理代码:
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1 :
bt.setText("正在下载...");
break;
case 2 :
Bitmap bm = (Bitmap) msg.obj;
iv.setImageBitmap(bm);
break;
case 3 :
Bundle bundle = msg.getData();
String data = bundle.getString("text");
bt.setText(data);
break;
}
}
};
msg.what是给成员变量what赋值,接受消息也就是在handleMessage里可以通过判断传入的值不同,做不同的操作
*******************************************************************************
耗时操作的种类
1:联网读取数据
2:读取本地较大的一个文件的时候