原文參考:
http://blog.csdn.net/chenzujie/article/details/7562838
android中的Handler類可以用來(lái)執(zhí)行Runnable類的run方法,它不同于java常用的兩種線程調(diào)用方法(1、將Runnable類放入Thread構(gòu)造函數(shù)中,然后調(diào)用start方法執(zhí)行;2、擴(kuò)展Thread類,覆寫run方法,并調(diào)用start方法執(zhí)行),此兩個(gè)方法會(huì)創(chuàng)建一個(gè)新的進(jìn)程執(zhí)行run方法,handler大部分則是在創(chuàng)建它的線程里直接運(yùn)行run方法。
handler可以分發(fā)Message對(duì)象和Runnable對(duì)象到主線程中, 每個(gè)Handler實(shí)例,都會(huì)綁定到創(chuàng)建他的線程中(一般是位于主線程),
它有兩個(gè)作用: (1): 安排消息或Runnable 在某個(gè)主線程中某個(gè)地方執(zhí)行, (2)安排一個(gè)動(dòng)作在不同的線程中執(zhí)行
Handler中分發(fā)消息的一些方法
post(Runnable)//立即將Runnable中run方法代碼放到當(dāng)前線程(創(chuàng)建handler的線程)執(zhí)行
postAtTime(Runnable,long)//在一定時(shí)間后將Runnable中run方法代碼放到當(dāng)前線程(創(chuàng)建handler的線程)執(zhí)行
postDelayed(Runnable long)//延遲一定時(shí)間后將Runnable中run方法代碼放到當(dāng)前線程(創(chuàng)建handler的線程)執(zhí)行
sendEmptyMessage(int)
sendMessage(Message)//發(fā)送一個(gè)消息給調(diào)用此方法的handler,并觸發(fā)該handler的handleMessage(Message msg)方法
sendMessageAtTime(Message,long)//在某一時(shí)間發(fā)送一個(gè)消息給調(diào)用此方法的handler,并觸發(fā)該handler的handleMessage(Message msg)方法
sendMessageDelayed(Message,long)//延遲一定時(shí)間后發(fā)送一個(gè)消息給調(diào)用此方法的handler,并觸發(fā)該handler的handleMessage(Message msg)方法
以上post類方法允許你排列一個(gè)Runnable對(duì)象到主線程隊(duì)列中,
sendMessage類方法, 允許你安排一個(gè)帶數(shù)據(jù)的Message對(duì)象到隊(duì)列中,等待更新,Message里可以存放各種數(shù)據(jù),如int,Bundle等來(lái)傳遞數(shù)據(jù)。
public class MyHandlerActivity extends Activity {
Button button;
MyHandler myHandler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handlertest);
button = (Button) findViewById(R.id.button);
myHandler = new MyHandler();
MyThread m = new MyThread();
new Thread(m).start();
}
/**
* 接受消息,處理消息 ,此Handler會(huì)與當(dāng)前主線程一塊運(yùn)行
* */
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper L) {
super(L);
}
// 子類必須重寫此方法,接受數(shù)據(jù)
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.d("MyHandler", "handleMessage......");
super.handleMessage(msg);
// 此處可以更新UI
Bundle b = msg.getData();
String color = b.getString("color");
MyHandlerActivity.this.button.append(color);
}
}
class MyThread implements Runnable {
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("thread.......", "mThread........");
Message msg = new Message();
Bundle b = new Bundle();// 存放數(shù)據(jù)
b.putString("color", "我的");
msg.setData(b);
MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler發(fā)送消息,更新UI
}
}
}
聯(lián)系客服