Handler里send和post方法的区别

在Android中handler用来进行进程间通信,其中有send和post两种方法,大家常用的send方法,其是在工作线程中处理完耗时操作后调用handler的sendMessage(message)把message对象发送给主线程,在主线程中重写handlerMessage()方法,判断接收到的消息进行更新UI的操作;而post方法传递的是一个runnable对象,更新UI的操作也是在这个runnable的run方法中进行的,也就是说run方法中的代码是执行在主线程中的,虽然它是写在工作线程中,主线程在接收到消息后自动执行runnable的run方法中的代码。
上图上代码:
这里写图片描述
这里写图片描述

public class MainActivity extends Activity {
    private Button btSend;
    private Button btPost;
    private TextView textview;
    private static final int SEND_UPDATA_TEXT=0;
    private Handler handler=new Handler(){
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case SEND_UPDATA_TEXT:
                textview.setText("sendMessage发来的消息");
                break;

            default:
                break;
            }
        };
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        setViews();
        //事件监听
        setListener();
    }

    private void setListener() {

       btSend.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Message message=new Message();
                    message.what=SEND_UPDATA_TEXT;
                    handler.sendMessage(message);
                }
            }).start();
        }
    });

       btPost.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //使用post发送消息
                    handler.post(new Runnable() {
                        //run方法中的代码执行在UI线程中
                        @Override
                        public void run() {
                            textview.setText("post发来消息");
                        }
                    });
                }
            }).start();
        }
    });
    }

    private void setViews() {
        btSend=(Button) findViewById(R.id.bt_send);
        btPost=(Button) findViewById(R.id.bt_post);
        textview=(TextView) findViewById(R.id.textview);
    }


}

其二 解释:

SENDMESSAGE OR POSTMESSAGE 吗?

前者等到执行结果返回,后者将消息送到消息队列之后返回^_^

其三 解释:

是的,前者中断进程,后者不中断进程

其四 解释:

post是一直在等到有空闲时才执行

其五解释:
send=>挂号信
post=>平信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: handler中的sendpost区别在于: 1. send方法是将消息立即发送到消息队列中,而post方法是将消息延迟发送到消息队列中。 2. send方法是同步的,即在发送消息后会等待消息处理完成后再继续执行后续代码,而post方法是异步的,即在发送消息后会立即返回,不会等待消息处理完成。 3. send方法可以返回一个布尔值,表示消息是否成功发送到消息队列中,而post方法没有返回值。 4. send方法可以在子线程中调用,但是post方法只能在主线程中调用。 总之,send方法适用于需要立即处理的消息,而post方法适用于需要延迟处理的消息。 ### 回答2: handlerAndroid中处理消息的机制,主要通过Message和Runnable两种方式来发送和处理消息。发送消息的方式有两种:sendpost。两者的区别在于发送消息的时机和方式不同。 send是在当前线程内同步发送消息,会等待消息处理完成后再返回。如果当前线程是UI线程,调用send发送消息会导致UI线程阻塞,容易引起ANR错误。因此,通常不建议在UI线程中使用send方法发送消息。而且send方法也容易导致死锁。 post是在消息队列尾部添加一条消息,然后立即返回。也就是说,消息发送是在异步线程中进行的,并不会阻塞当前线程。与send不同,post方法的处理时间无法确定,会等当前线程空闲时才处理该消息。因此,post方法是常用的一种发送消息的方式。 综上所述,在Android开发中,建议使用post方法handler发送消息,特别是在UI线程中。如果必须在UI线程中发送消息,可以借助AsyncTask,它把任务相关的操作都放在一个独立的线程中进行,避免了UI线程阻塞和ANR错误。但是,AsyncTask也有一些缺点,比如无法控制线程池的大小,如果任务过多,容易导致内存泄露。因此,在使用AsyncTask时需要特别小心。 ### 回答3: handlerandroid中常用的用于实现线程通信的类,其sendpost方法都可以用于向handler所在的线程发送消息或任务,但是二者的具体区别还是有一些的。 首先,二者的语法不同,send方法的语法为`sendMessage(Message msg)`,而post方法的语法为`post(Runnable r)`。 其次,二者在实现机制上有所不同。send方法是将消息封装成Message对象后,通过handler所在的线程的消息队列进行传输和处理;而post方法则是通过Handler所在的线程的消息队列将Runnable对象插入到队列中。因此,send方法的处理过程是与MessageQueue相关的,而post方法的处理过程是与looper相关的。 最后,二者的使用场景也有所不同。由于send方法需要将消息封装成Message对象,因此在使用时需要额外编写一些代码,同时send方法的返回值是boolean类型,表示消息是否成功加入发送队列。相对而言,post方法则更加简单,只需要传入一个Runnable对象就可以了。因此,如果只是简单的向Handler所在的线程发送任务,建议使用post方法;而如果需要在任务之间传递一些数据,或者需要对消息进行一些操作,比如取消或延迟执行等,则使用send方法更加方便。 总之,对于handler来说,sendpost方法都是不可或缺的方法,二者都能够实现线程间的通信,同时也具有不同的特点和使用场景,需要根据具体情况而定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值