在使用handler 的時(shí)候注意到除了sendMessage()的幾個(gè)方法,還有post() 和postDelayed()。那么post 和send 有啥區(qū)別呢?
網(wǎng)上搜了一下,發(fā)現(xiàn)很多說(shuō)handler.post(runnable) 開(kāi)啟了新的線程執(zhí)行任務(wù),或者說(shuō)post(runnable)是異步執(zhí)行。
注意: 錯(cuò)的 !這都是錯(cuò)的??!post() 即沒(méi)有開(kāi)啟新的線程,也不是異步操作?。?!
代碼來(lái)驗(yàn)證一下
@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();
}
}
}
});
}
主線程里注冊(cè)了一個(gè)點(diǎn)擊事件,handler post一個(gè)runnable ,runnable里是耗時(shí)任務(wù),運(yùn)行代碼 Log.d("run", "name =" + Thread.currentThread().getName());打印的是main 。點(diǎn)擊按鈕Log.d("onClick", "444444");沒(méi)有打印,幾秒后彈出無(wú)響應(yīng)
說(shuō)明了runnable 還是在main線程里執(zhí)行,runnable 里的耗時(shí)任務(wù)會(huì)阻塞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);
}
發(fā)現(xiàn)跟sendMessage()一樣 都調(diào)用了sendMessageDelayed()這個(gè)方法,getPostMessage()
把runnable 打包成message 最終還是發(fā)送的message
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
再去看一下message 分發(fā)的代碼
/**
* 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不為空,就執(zhí)行handleCallback(),handleCallback()里就一行代碼,執(zhí)行run()方法。這全程沒(méi)有一丁點(diǎn)異步的東西。所以網(wǎng)上看資料要謹(jǐn)慎呢!!