Android--Handler初步理解及基本使用

wdmx3331 8年前發布 | 5K 次閱讀 安卓開發 Android開發 移動開發

1、什么是Handler

Handler是android給我們提供用來更新UI的一套機制;也是一套消息處理機制,可以發送消息,也可以通過它處理消息。

2、Android為什么需要Handler機制來更新UI?

根本目的:解決多線程并發問題。

比如在一個Activity中有多個線程去更新一個UI,且沒有加鎖的情況下,是會出現更新界面錯亂的。如果對更新UI進行加鎖,又會出現應用性能下降的問題。

3、如何使用Handler

3.1、基本使用

private Handler handler1 = new Handler(){
    public void handleMessage(android.os.Message msg) {
        T.show(TestHandlerActivity.this, "handleMessage");
    };
};
//給Handler發送消息
public void testHandler(View v){
            //發送一個空消息
    handler1.sendEmptyMessage(i);
    i++;
    //發送一個自已定義的Message
    Message obtainMessage = handler1.obtainMessage();
    //攜帶一個int類型
    obtainMessage.arg1 = 0;
    //攜帶一個int類型
    obtainMessage.arg2 = 1;
    //攜帶一個objcet
    obtainMessage.obj = new Person("thc","cool");
    //Message的標志
    obtainMessage.what = 1;
    handler1.sendMessage(obtainMessage);
    //也可以 obtainMessage.sendToTarget();后面再解釋

Message msg = new Message();
obtainMessage.arg1 = 0;
obtainMessage.arg2 = 1;
obtainMessage.obj = new Person("thc","cool");
obtainMessage.what = 2;
handler1.sendMessage(msg);

}</code></pre>

handler1.obtaineMessage()和new Message()的區別:

public static Message obtain() {
    synchronized (sPoolSync) {
        if (sPool != null) {
            Message m = sPool;
            sPool = m.next;
            m.next = null;
            m.flags = 0; // clear in-use flag
            sPoolSize--;
            return m;
        }
    }
    return new Message();
}

從Message的源碼中可以看出,它是先從消息池中取一個消息,如果池中有消息就從池中取出一個,如果沒有就new一個Message,所以我們使用的時候使用handler.obtainMessage就可以了,節省資源。

以及handler1.post(runnable r)等:

//
public void test2() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            //運行在子線程中
            L.D("當前線程--->" + Thread.currentThread());
            handler1.post(new Runnable() {
                @Override
                public void run() {
                    //運行在UI線程中
                    L.D("當前線程--->" + Thread.currentThread());
                }
            });
        }
    });
}

3.2、攔截Message

通過給Handler增加一個CallBack對消息可以對消息進行攔截。返回true攔截,返回false不攔截。

private Handler handler1 = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        if(msg.what == 0){
            //攔截Msg
            tvTest.setText("攔截了");
            return true;
        }
        T.show(TestHandlerActivity.this, "callBack");
        return false;
    }
}){
    public void handleMessage(android.os.Message msg) {
        T.show(TestHandlerActivity.this, "handleMessage");
    };
};

3.3、remove 一個 Runnable

MyRunable mRunable = new MyRunable();
//運行一個Runnable,在運行一段時間之后讓它停止掉即:remove掉這個Runable對象
public void test3() {
    handler1.postDelayed(mRunable,1000);
    if(i > 3){
        handler1.removeCallbacks(mRunable);
    }
}
class MyRunable implements Runnable{
    @Override
    public void run() {
        tvTest.setText("收到消息:" + i);
        i++;
        handler1.postDelayed(mRunable, 1000);
    }
}

 

來自:http://www.jianshu.com/p/4311a098ebaa

 

 本文由用戶 wdmx3331 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!