在使用handler 的时候注意到除了sendMessage()的几个方法,还有post() 和postDelayed()。那么post 和send 有啥区别呢?
网上搜了一下,发现很多说handler.post(runnable) 开启了新的线程执行任务,或者说post(runnable)是异步执行。
注意: 错的 !这都是错的!!post() 即没有开启新的线程,也不是异步操作!!!
代码来验证一下
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.buttonA).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("onClick", "444444");
}
});
Handler handler1 = new Handler();
handler1.post(new Runnable() {
@Override
public void run() {
while (true) {
Log.d("run", "name =" + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
主线程里注册了一个点击事件,handler post一个runnable ,runnable里是耗时任务,运行代码 Log.d("run", "name =" + Thread.currentThread().getName())
;打印的是main
。点击按钮Log.d("onClick", "444444");
没有打印,几秒后弹出无响应
说明了runnable 还是在main线程里执行,runnable 里的耗时任务会阻塞main线程。
看下post的源码
public final boolean post(@NonNull Runnable r) {
return sendMessageDelayed(getPostMessage(r), 0);
}
public final boolean sendMessage(@NonNull Message msg) {
return sendMessageDelayed(msg, 0);
}
发现跟sendMessage()一样 都调用了sendMessageDelayed()这个方法,getPostMessage()
把runnable 打包成message 最终还是发送的message
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
再去看一下message 分发的代码
/**
* Handle system messages here.
*/
public void dispatchMessage(@NonNull Message msg) {
//msg.callback 就是post的runnable
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
private static void handleCallback(Message message) {
message.callback.run();
}
如果message.callback不为空,就执行handleCallback(),handleCallback()里就一行代码,执行run()方法。这全程没有一丁点异步的东西。所以网上看资料要谨慎呢!!
网友评论