1. 程式人生 > >handler.post 運用

handler.post 運用

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操作了。