Android消息處理機制Handler、Looper、Message

        前幾篇文章寫的都是網絡請求數據,在請求到數據之後,要現在在UI界面上時,總是使用Handler攜帶請求下來的數據發送一條消息,在Handler的handlerMessage()方法中修改UI,這篇文章將講述它的原理(我自己理解的,不喜勿噴)。

       Android規定:

       1、不能在主線程中做耗時操作,如果在主線程中做耗時操作,則會出現ANR(Application Not Response)錯誤。

       2、不能在子線程中修改UI界面。

       要遵守以上兩個規定,在請求到網絡數據後,通常情況下,我會使用Handler消息更新UI。

       在程序運行起來的時候,應用的主線程會啓動Looper對象的消息隊列,主線程會一直從消息隊列中循環的取消息,在主線程中,創建一個Handler對象,使用該對象可以在應用的任何地方向主線程發送消息,如果取到消息了,則在主線程的Handler對象的handlerMessage()方法中處理消息。

       Handler消息機制的步驟

       1、創建Handler對象,並重寫handlerMessage()方法。

 

private Handler mHandler = new Handler (){
    @Override
    public void handleMessage (Message msg) {
        switch (msg.what){
            case MSG_STRING:
                String text = (String) msg.obj;
                tv.setText (text);
                break;
            case MSG_IMAGE:
                Bitmap bitmap = (Bitmap) msg.obj;
                iv.setImageBitmap (bitmap);
                break;
        }
    }
};

       2、在其它線程中發送消息。

 

 

//發送Handler消息,跟新UI
Message msg = new Message ();
msg.what = MSG_IMAGE;
msg.obj = bitmap;
mHandler.sendMessage (msg);

      3、根據消息即攜帶的參數,修改UI。

 

 

Bitmap bitmap = (Bitmap) msg.obj;
iv.setImageBitmap (bitmap);

      注意:1、創建消息對象時,儘量使用

Message msg = Message.obtain ();

                 2、使用msg.what區別不同的消息。

 

                 3、參數一般放在msg.obj中。

      

發佈了78 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章