chap 14. 프로세스와 스레드. 2012 생능출판사 all rights reserved 다중 스레딩...

28
CHAP 14. 프프프프프 프프프

Upload: marshall-charles

Post on 19-Jan-2018

221 views

Category:

Documents


0 download

DESCRIPTION

© 2012 생능출판사 All rights reserved 안드로이드에서의 프로세스와 스레드 애플리케이션이 시작되면 안드로이드 시스템은 새 로운 리눅스 프로세스를 생성한다. 기본적으로 애플리케이션 안의 모든 컴포넌트들은 동일한 프로세스의 동일한 스레드로 실행된다. 이 기본적인 스레드를 메인 스레드 (main thread) 라 고 부른다.

TRANSCRIPT

Page 1: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

CHAP 14. 프로세스와 스레드

Page 2: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을

하는 것 이들 작업은 스레드 (thread) 라고 불린다 .

Page 3: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

안드로이드에서의 프로세스와 스레드 애플리케이션이 시작되면 안드로이드 시스템은

새로운 리눅스 프로세스를 생성한다 .

기본적으로 애플리케이션 안의 모든 컴포넌트들은 동일한 프로세스의 동일한 스레드로 실행된다 .

이 기본적인 스레드를 메인 스레드 (main thread) 라고 부른다 .

Page 4: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

메인 스레드 메인 스레드는 사용자 인터페이스 위젯에게

이벤트를 전달하거나 화면을 그리는 작업을 담당 UI 스레드 (user interface thread) 라고도

불린다 .

Page 5: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

안드로이드의 단일 스레드 모델 원칙 UI 스레드는 블록시키면 안된다 . UI 스레드 외부에서 안드로이드 UI 툴킷을

조작하면 안된다 .

Page 6: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

작업 스레드 별도로 생성되는 스레드 배경 스레드 ("background" thread) 라고도

한다 .

Page 7: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

작업 스레드를 작성하는 방법 Thread 클래스를 상속받아서 스레드를 작성하는

방법

Runnable 인터페이스를 구현한 후에 Thread 객체에 전달하는 방법

Page 8: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

THREAD 상속방법...public class ThreadTest extends Activity {

WorkerThread w;boolean running = true;class WorkerThread extends Thread {

public void run() {int i = 0;for (i = 0; i < 20 && running i++) {

try {Thread.sleep(1000);

} catch (InterruptedException e) {}Log.v("THREAD", "time=" + i);

}}

}

Page 9: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

THREAD 상속방법public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.main);

}@Overridepublic void onStart() {

super.onStart();w = new WorkerThread();running = true;w.start();

}@Overridepublic void onStop() {

super.onStop();running = false;

}}

Page 10: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

실행 결과

Page 11: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

RUNNABLE 인터페이스를 구현 방법...public class ThreadTest extends Activity {

Thread w;boolean running = true;@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.main);

}

Page 12: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

public void onStart() {super.onStart();w = new Thread(new Runnable() {

public void run() {int i = 0;for (i = 0; i < 20 && running i++) {

try {

Thread.sleep(1000);} catch

(InterruptedException e) {}Log.v("THREAD", "time="

+ i);}

}});running = true;w.start();

}public void onStop() {

super.onStop();running = false;

}}

Page 13: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

실행결과

Page 14: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

public void onClick(View v) {    new Thread(new Runnable() {        public void run() {

Bitmap b = loadImageFromNetwork("http://example.com/im-age.png");

mImageView.setImageBitmap(b); }            }).start();}

주의할 점 스레드에서 직접적으로 사용자 인터페이스 위젯을

변경하면 안 된다 .

Page 15: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

해결할 수 있는 3 가지 방법 Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long)

Page 16: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

VIEW.POST(RUNNABLE) 사용public void onClick(View v) {    new Thread(new Runnable() {        public void run() {            final Bitmap bitmap =

loadImageFromNetwork("http://example.com/im-age.png");            mImageView.post(new Runnable() {                public void run() {                    mImageView.setImageBitmap(bitmap);                }            });        }    }).start();}

Page 17: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

HANDLER 사용class WorkerThread extends Thread {

Handler handler;WorkerThread(Handler handler) {

this.handler = handler;}public void run() {

for (int i = 0; i < 20; i++) {try {

Thread.sleep(1000);} catch (InterruptedException e) {}Message msg = new Message();msg.what = 1;msg.arg1 = i;handler.sendMessage(msg);

}}

}

Page 18: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

HANDLER 사용...public class HandlerTest extends Activity {

WorkerThread thread;TextView text;Handler handler;public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.main);text = (TextView) findViewById(R.id.text);

handler = new Handler() {public void handleMessage(Message msg)

{if (msg.what == 1) {

text.setText(" 카운터 =" + msg.arg1);

}}

}thread = new WorkerThread(handler);thread.start();

}}

Page 19: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

실행 결과

Page 20: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

HANDLER 클래스를 사용하는 방법 러너블 객체를 UI 스레드로 보낼 수 있다 .

Page 21: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

사용자 인터페이스 작성<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" >

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /><ProgressBar

android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/progress_bar" style="?android:attr/progressBarStyleHorizontal">

</ProgressBar></LinearLayout>

Page 22: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

액티비티 작성...public class ProgressBarTest extends Activity {

private static final int PROGRESS = 0x1;private ProgressBar mProgress;private int mProgressStatus = 0;int i = 0;protected void onCreate(Bundle icicle) {

super.onCreate(icicle);setContentView(R.layout.main);mProgress = (ProgressBar)

findViewById(R.id.progress_bar);//

Page 23: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

액티비티 작성new Thread(new Runnable() {

public void run() {while (mProgressStatus < 100) {

try {Thread.sleep(1000); }

catch (InterruptedException e) { }

mProgressStatus = i++;// mProgress.post(new

Runnable() {public void run()

{

mProgress.setProgress(mProgressStatus);}

});}

}}).start();

}}

Page 24: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

실행 결과

Page 25: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

ASYNC 클래스 사용 방법 AsyncTask 클래스는 1.5 버전부터 추가된

클래스로서 작업 스레드와 관련된 복잡한 부분을 쉽게 처리해주는 클래스

Page 26: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

예제...public class AsyncTest extends Activity {

private ProgressBar mProgress;private int mProgressStatus = 0;public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.main);mProgress = (ProgressBar)

findViewById(R.id.progress_bar);Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new

Button.OnClickListener() {public void onClick(View v) {

new CounterTask().execute(0);}

});}

Page 27: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

class CounterTask extends AsyncTask<Integer, Integer, Integer> {protected void onPreExecute() { }protected Integer doInBackground(Integer... value) {

while (mProgressStatus < 100) {try {

Thread.sleep(1000); } catch (InterruptedException e) {

}mProgressStatus++; publishProgress(mProgressStatus);

}return mProgressStatus;

}protected void onProgressUpdate(Integer... value) {

mProgress.setProgress(mProgressStatus);}protected void onPostExecute(Integer result) {

mProgress.setProgress(mProgressStatus);}

}}

Page 28: CHAP 14. 프로세스와 스레드. 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은

© 2012 생능출판사 All rights reserved

실행 결과