總網頁瀏覽量

2012年3月5日 星期一

Android Handler


Handler
使用Handlerpost方法,將要執行的執行緒物件加到佇列中
handler.post(updateThread); 馬上加入到消息佇列內

創造一個Handler物件
Handler handler = new Handler();

將要執行的功能寫到執行緒物件的run方法中
Runnable updateThread = new Runnable(){
        @override
        public void run(){
        System.out.println(“UpdareThread”);
        handler.postDelayed(updateThread, 3000); 3000毫秒加一次
}
}
Thread移除
handler.removeCallbacks(updateThread);

ProgressBar加入到Handler
根據控制鍵ID取的代表控制鍵的物件,並為按鈕設置監聽器
Runnable updateThread = new Runnable(){
int i = 0 ;
        @Override
        public void run() {
            System.out.println("Begin Thread");
            i = i + 10 ;
                //取的一個消息物件,Message類別由Android操作系統提供
            Message msg = updateBarHandler.obtainMessage();
                //msg物件的arg1參數設置為I,用arg1arg2這兩個成員資料傳遞消息,優點為系統  性能消耗較少
            msg.arg1 = i ;
            try {
                        //設置當前執行緒睡眠1
                        Thread.sleep(1000);
            } catch (InterruptedException e) {
                        e.printStackTrace();
            }
                //msg物件加入到消息佇列中
                updateBarHandler.sendMessage(msg);
            if( i == 100){ //i值為100時,將執行緒物件從Handler中移除
                        updateBarHandler.removeCallbacks(updateThread);
            }
        }
};

//使用匿名內部類別來覆寫Handler中的handleMessage方法
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) { //取得Message msg
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);
}

sendMessage(msg); msg到佇列
handleMessage(Message msg) 從佇列取msg

Handler不是產生一個thread來執行而是直接使用runnable方法

Bundle 類似鍵值對


HandlerThread 實作了looper來處理消息佇列功能
這個類別由Android應用程序框架提供
HandlerThread  handlerThread = new HandlerThread(“handler_thread”);
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage(); //得到消息
Msg.sendToTarget(); //msg發送到目標物件,所謂的目標物件就是生成msg物件的handler物件

class MyHandler exteands Handler{
        public MyHandler(){
}
Public MyHandler(Looper looper){ //handler綁定到looper
        super(looper);
}
}

傳送資料與取得資料
msg.obj=”abc”;
String s = (String)msg.obj;

傳送大量資料利用Bundle
Bundle b = new Bundle();
b.putInt(“age”, 20);
b.putString(“name”, “Jhon”);
msg.setData(b);
msg.sendToTarget();

取資料
Bundle b = msg.getData();
Int ag = b.getInt(“age”);
String name = b.getString(“name”);

沒有留言:

張貼留言