在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