美文网首页
sendMessage和postMessage和sentToTa

sendMessage和postMessage和sentToTa

作者: 风月寒 | 来源:发表于2019-08-05 11:57 被阅读0次

sendMessage

阻塞,发送消息后会等到结果的返回,返回一个result.

都是从整个Messge池中返回一个新的Message实例,在许多情况下使用它,能避免分配新的对象,从而减少内存的开销了

postMessage

不会阻塞,不等结果的返回,直接返回一个boolean值。

sentToTarget

sentToTarget中也是调用sendMessage,所以跟第一种是一样的。

获取Message的三种方式

Message msg = handler.obtainMessage();
msg.arg1 = i;
msg.sendToTarget();
handler.obtainMessage()实际调用的是message.obtain(this)

Message msg=new Message();
msg.arg1=i;
handler.sendMessage(msg);

Message msg= Message.obtain();
msg.arg1=i;
handler.sendMessage(msg);

UI的刷新

1、handler.sendMessage();

handler.senMessage() + handler.dispatchMessage() 

因为在dispatchMessage()的源码中调用了handleMessage()去处理message,所以也可以在dispatchMessage()对message进行一系列的操作。

handler.senMessage() + handler.handleMessage()

2、andler.post();

new Thread(){
            @Override
            public void run() {
                try {
                    //你的处理逻辑,这里简单睡眠一秒
                    this.sleep(1000);
                    
                    //利用obtain
                    msg = Message.obtain(mainHandler, new Runnable() {
                        
                        @Override
                        public void run() {
                            titleView.setText("sendMsg——Result");
                        }
                    });
                    msg.sendToTarget();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();

3、在activity中可以 runOnUiThread();

new Thread(){
            @Override
            public void run() {
                try {
                    //你的处理逻辑,这里简单睡眠一秒
                    this.sleep(1000);
                    
                    runOnUiThread(new Runnable() {
                        
                        @Override
                        public void run() {
                            titleView.setText("runOnUiThread——Result");
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();

4、在子view中可以 view.post()

new Thread(){
            @Override
            public void run() {
                try {
                    //你的处理逻辑,这里简单睡眠一秒
                    this.sleep(1000);
                    
                    viewPostBtn.post(new Runnable() {
                        
                        @Override
                        public void run() {
                            titleView.setText("viewPost——Result");
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();

相关文章

网友评论

      本文标题:sendMessage和postMessage和sentToTa

      本文链接:https://www.haomeiwen.com/subject/cnnpdctx.html