52
HandlerThread的關係 Johnny Sung 2013/08/22 多執行- 1 Thursday, August 22, 13

[Android] 多執行緒 - Handler和Thread的關係

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: [Android] 多執行緒 - Handler和Thread的關係

Handler和Thread的關係

Johnny Sung2013/08/22

多執行緒-

1Thursday, August 22, 13

Page 2: [Android] 多執行緒 - Handler和Thread的關係

關於我

• I'm an Android developer. Also learning iOS development.

• Information Management in Shih Hsin University

• 相關作品:

• Good! 愛點兒

• 世新廣播電台

• 主要語⾔言:

• Obj-C / Java / C# / PHP

2Thursday, August 22, 13

Page 3: [Android] 多執行緒 - Handler和Thread的關係

Good! 愛點兒

3Thursday, August 22, 13

Page 4: [Android] 多執行緒 - Handler和Thread的關係

世新廣播電台

4Thursday, August 22, 13

Page 5: [Android] 多執行緒 - Handler和Thread的關係

5Thursday, August 22, 13

Page 6: [Android] 多執行緒 - Handler和Thread的關係

6Thursday, August 22, 13

Page 7: [Android] 多執行緒 - Handler和Thread的關係

問題

7Thursday, August 22, 13

Page 8: [Android] 多執行緒 - Handler和Thread的關係

8Thursday, August 22, 13

Page 9: [Android] 多執行緒 - Handler和Thread的關係

9

ANR = Activity Not Responding

http://developer.android.com/training/articles/perf-anr.html

Thursday, August 22, 13

Page 10: [Android] 多執行緒 - Handler和Thread的關係

MultiThreading 多執行緒

•Runnable

•Thread

•Handler

•Message

10Thursday, August 22, 13

Page 11: [Android] 多執行緒 - Handler和Thread的關係

11Thursday, August 22, 13

Page 12: [Android] 多執行緒 - Handler和Thread的關係

Runnable

12Thursday, August 22, 13

Page 13: [Android] 多執行緒 - Handler和Thread的關係

13Thursday, August 22, 13

Page 14: [Android] 多執行緒 - Handler和Thread的關係

class GetWebPicture implements Runnable{ @Override public void run() { // ........

}}

14Thursday, August 22, 13

Page 15: [Android] 多執行緒 - Handler和Thread的關係

Thread顧名思義,它就叫執⾏行緒

15Thursday, August 22, 13

Page 16: [Android] 多執行緒 - Handler和Thread的關係

16Thursday, August 22, 13

Page 17: [Android] 多執行緒 - Handler和Thread的關係

Thread又有分二種

•單次型 Thread (Java原有的)

•常駐型 HandlerThread (Android特有的)

常駐型 HandlerThread留到後⾯面再說17

Thursday, August 22, 13

Page 18: [Android] 多執行緒 - Handler和Thread的關係

18

new Thread(new Runnable(){ @Override public void run() { // ......

}}).start();

Thursday, August 22, 13

Page 19: [Android] 多執行緒 - Handler和Thread的關係

new Thread(){ @Override public void run() { // ....

}}.start();

19Thursday, August 22, 13

Page 20: [Android] 多執行緒 - Handler和Thread的關係

Main Thread(UI Thread)20Thursday, August 22, 13

Page 21: [Android] 多執行緒 - Handler和Thread的關係

Main Thread(UI Thread)20Thursday, August 22, 13

Page 22: [Android] 多執行緒 - Handler和Thread的關係

new Thread(){ @Override public void run() { // .... }}.start();

Thread1

Main Thread(UI Thread)20Thursday, August 22, 13

Page 23: [Android] 多執行緒 - Handler和Thread的關係

new Thread(){ @Override public void run() { // .... }}.start();

Thread1

Main Thread(UI Thread)20Thursday, August 22, 13

Page 24: [Android] 多執行緒 - Handler和Thread的關係

new Thread(){ @Override public void run() { // .... }}.start();

Thread1

Main Thread(UI Thread)

runOnUiThread(new Runnable(){ public void run() { // ......

}});

20Thursday, August 22, 13

Page 25: [Android] 多執行緒 - Handler和Thread的關係

new Thread(){ @Override public void run() { // .... }}.start();

Thread1

Main Thread(UI Thread)

runOnUiThread(new Runnable(){ public void run() { // ......

}});

20Thursday, August 22, 13

Page 26: [Android] 多執行緒 - Handler和Thread的關係

HandlerThread是⼀一種常駐型的Thread

21Thursday, August 22, 13

Page 27: [Android] 多執行緒 - Handler和Thread的關係

mThread = new HandlerThread("name");mThread.start();mThreadHandler = new Handler(mThread.getLooper()){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case START_SERVER: // ..... break; case STOP_SERVER: // ..... break; default: break; } }};

在onCreate()之中

22Thursday, August 22, 13

Page 28: [Android] 多執行緒 - Handler和Thread的關係

在onDestroy()之中

if (mThread != null) mThread.quit();

寫在Service裡⾯面不錯⽤用23

Thursday, August 22, 13

Page 29: [Android] 多執行緒 - Handler和Thread的關係

Main Thread(UI Thread)

onCreate()

onResume()

onPause()

onDestroy()

24Thursday, August 22, 13

Page 30: [Android] 多執行緒 - Handler和Thread的關係

HandlerThread1

Main Thread(UI Thread)

onCreate()

onResume()

onPause()

onDestroy()

mThread = new HandlerThread("name");mThread.start();

24Thursday, August 22, 13

Page 31: [Android] 多執行緒 - Handler和Thread的關係

HandlerThread1

Main Thread(UI Thread)

onCreate()

onResume()

onPause()

onDestroy()

mThread = new HandlerThread("name");mThread.start();

if (mThread != null) mThread.quit();

24Thursday, August 22, 13

Page 32: [Android] 多執行緒 - Handler和Thread的關係

HandlerThread1

Main Thread(UI Thread)

onCreate()

onResume()

onPause()

onDestroy()

mThread = new HandlerThread("name");mThread.start();

if (mThread != null) mThread.quit();

(Idle)

(Running)

(Running)

(Idle)

(Idle)

24Thursday, August 22, 13

Page 33: [Android] 多執行緒 - Handler和Thread的關係

Handler

25Thursday, August 22, 13

Page 34: [Android] 多執行緒 - Handler和Thread的關係

26Thursday, August 22, 13

Page 35: [Android] 多執行緒 - Handler和Thread的關係

Handler mHandler = new Handler() {

@Override public void handleMessage(Message msg) { switch (msg.what) { case 0: // ....... break; case 1: // ....... break; case 2: // ....... break; default: break; } }

};

27Thursday, August 22, 13

Page 36: [Android] 多執行緒 - Handler和Thread的關係

Message

28Thursday, August 22, 13

Page 37: [Android] 多執行緒 - Handler和Thread的關係

Message就是要一言以蔽之

29Thursday, August 22, 13

Page 38: [Android] 多執行緒 - Handler和Thread的關係

用一個值 (一句話)

代表一堆事情(Runnable)

30Thursday, August 22, 13

Page 39: [Android] 多執行緒 - Handler和Thread的關係

31Thursday, August 22, 13

Page 42: [Android] 多執行緒 - Handler和Thread的關係

我只想寫個小東西

Message & Handler 方式對我來說太複雜了

34Thursday, August 22, 13

Page 43: [Android] 多執行緒 - Handler和Thread的關係

有沒有更快的方法?

35Thursday, August 22, 13

Page 44: [Android] 多執行緒 - Handler和Thread的關係

有!

36Thursday, August 22, 13

Page 45: [Android] 多執行緒 - Handler和Thread的關係

runOnUiThread()

37Thursday, August 22, 13

Page 46: [Android] 多執行緒 - Handler和Thread的關係

runOnUiThread(new Runnable(){ public void run() { // ......

}});

38Thursday, August 22, 13

Page 47: [Android] 多執行緒 - Handler和Thread的關係

讓我們看一下原始碼

39Thursday, August 22, 13

Page 48: [Android] 多執行緒 - Handler和Thread的關係

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/Activity.java

// Reference from Activity.java/** * Runs the specified action on the UI thread. If the current thread is the * UI thread, then the action is executed immediately. If the current thread * is not the UI thread, the action is posted to the event queue of the UI * thread. * * @param action * the action to run on the UI thread */

public final void runOnUiThread(Runnable action){ if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); }}

40Thursday, August 22, 13

Page 49: [Android] 多執行緒 - Handler和Thread的關係

41Thursday, August 22, 13

Page 50: [Android] 多執行緒 - Handler和Thread的關係

Q & A

42Thursday, August 22, 13

Page 51: [Android] 多執行緒 - Handler和Thread的關係

Follow me on Blog

43Thursday, August 22, 13

Page 52: [Android] 多執行緒 - Handler和Thread的關係

Follow me on Facebook

44Thursday, August 22, 13