天天看點

android下關于Handler、Looper、HandlerThread之間的聯系與差別

  在android下程式設計如果要用到線程就必然要用到handler、looper或者looperthread,這三者時間的聯系與差別是什麼呢?通過看sdk、上網看别人寫的部落格以及自己程式設計實踐,到底是對這三者有了一定的了解,現在将自己的了解寫下來,希望對大家可以有點幫助。

  handler:每個handler執行個體都與建立該handler的線程以及線程的消息隊列想關聯,而handler的主要作用就是對消息隊列進行管理,主要展現在處理或者發送message以及runnable對象。

 looper:looper用于維護一個一個線程的消息循環和消息隊列,在我看來looper做的事一些相對較底層的維護工作(本人是一個菜鳥,沒有看到這麼底層)。一個線程隻要有了looper來管理,就可以接收消息并處理。是以是looper是用來維護消息隊列的,handler是處理消息隊列的消息的。在主線程中,我們可以直接用hanler來處理消息,這是因為主線程已經有了looper來維護消息隊列了。如果是子線程,就需要自己建立looper了。

接下來看看sdk上的示例

  好了,說了這麼多,還是上上代碼吧:

  package org.asia;

import android.app.activity;

import android.os.bundle;

import android.os.handler;

import android.os.looper;

import android.os.message;

import android.view.view;

import android.view.view.onclicklistener;

import android.widget.button;

import android.widget.textview;

public class threadtestactivity extends activity {

private textview text;

private button button;

private looperthread loop;

private handler hand;

    /** called when the activity is first created. */

    @override

    public void oncreate(bundle savedinstancestate) {

        super.oncreate(savedinstancestate);

        setcontentview(r.layout.main);

        text=(textview)findviewbyid(r.id.text);

        button=(button)findviewbyid(r.id.button);

        loop=new looperthread();

        loop.start();

        hand=loop.gethandler();

        button.setonclicklistener(new onclicklistener()

        {

public void onclick(view v) {

// todo auto-generated method stub

hand.sendmessage(null);

}

        });

    }

    class looperthread extends thread

    {

        private handler handler;

@override

public void run() {

super.run();

looper.prepare();//建立looper

handler=new handler()//建立子線程的handler并且重寫handlemessage函數

{

public void handlemessage(message msg) {

super.handlemessage(msg);

system.out.println(thread.currentthread().getname());

};

looper.loop();//是looper開始運作起來

handler gethandler()

return handler;

llooperlooperlooperlooperooper