Handler.post()和handler.sendMessage()总结

时间:2022-08-02 17:32:48

 

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()和handler.sendMessage()总结

 

Handlerpost(r)方法和HandlersendMessage方法

博客一:

一般来说在工作线程中执行耗时任务,当任务完成时,会返回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:读取本地较大的一个文件的时候