2015年4月14日 星期二

Thread 跟 Handler


原文出處: http://csstalker.gjisland.net/blog/archives/543

// Runnable 顧名思義就是一個可以跑的東西,一個工作

private Runnable r1 = new Runnable()

{

public void run()

{

// to do list

}

};

斯斯有三種,thread 有兩種,一次性跟常駐性

========================

1. 一次性 thread

Thread t1 = new Thread(r1);

t1.start();

========================

2. 常駐性 thread

private Handler boss;

private HandlerThread worker;

// 把她製造出來,啟動,待命

worker = new HandlerThread(“name”);

worker.start();

// 綁到一個 handler 身上,簡單說,thread 跟 handler 的關係就像是藝人跟經紀人

boss = new Handler(worker.getLooper());

// 務必要確定在 getLooper() 前先讓 thread 跑起來

// 發一個通告 (work, runnable) 給藝人要先透過他的經紀人

boss.post(r1);

// we usually create thread in onCreate() status

// also that we should terminate the thread when app into onDestroy() status

// 我們通常在 app 第一次執行時的 onCreate 狀態就把 thread 找來

// 同理,app 爆炸 (onDestroy) 之前要喊 塊陶阿!!,不對,是要把 thread 結束掉

@Override

protected void onDestroy()

{

super.onDestroy();

// remove the work from thread

if(boss != null)

{

boss.removeCallbacks(r1);

}

// terminate the thread

if (worker != null)

{

worker.quit();

}

}

=========================

透過 handler 指派工作有兩種方法

一個是

mThreadHandler.post(r1);

另外一種是

mThreadHandler.sendemptyMessage(go_away);

// 建立基於 main thread (UI thread) 的 handler

private Handler mUI_handler = new Handler();

// 另外一種形態,在裡面新增一個 method 可用來處理訊息

private Handler mUI_handler = new Handler()

{

@Override

public void handleMessage(message msg)

{

switch(msg.what)

{

case go_away:

// do something

break;

}

}

};

其中 case 內容如果要直接用變數名稱那當然要事先宣告

private static final int go_away = 3345678;

如果需要夾帶參數就要用 obtainMessage

mUI_handler.obtainMessage(go_away, arg1, arg2).sendToTarget();

anyway…玩法很多

話說 ICS 後很多事情都變很嚴格

這大概算是必要之惡