handler.post 運用
阿新 • • 發佈:2018-12-18
1. 主執行緒中的使用:
new Handler().post(new Runnable() {
@Override
public void run() {
mTest.setText("post");//更新UI
}
});
這段程式碼裡並沒有開啟了一個子執行緒(呼叫的是 run 而不是 start 。),因此並不是子執行緒,其實還是在主執行緒中。一般不這樣用,也沒人這樣用,並沒有多大意義,這就像是在主執行緒中給主執行緒sendmessage,並沒有什麼意義(我們知道sendmessage是子執行緒為了通知主執行緒更新UI的),主執行緒是可以直接更新UI的。
2.子執行緒使用:
Handler handler; new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); handler.post(new Runnable() { @Override public void run() { mTest.setText("post");//更新UI } }); } catch (InterruptedException e) { e.printStackTrace(); } } }).start();
這兒的post並不是新開啟的子執行緒,存在的子執行緒只有一個,即為new的Thread,那麼為什麼我們在其中可以settext做更新UI的操作呢? 其實post方法post過去的是一段程式碼,相當於將這個Runable體放入訊息佇列中,那麼looper拿取的即為這段程式碼去交給handler來處理。 其實也相當於我們常用的下面這段程式碼:
private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: mTest.setText("handleMessage");//更新UI break; } } };
就是用這個Runnable體代替了上面這一大段程式碼,當然,我們的post方法就可以執行UI操作了。