Chapter 14

flosssnailsΚινητά – Ασύρματες Τεχνολογίες

10 Δεκ 2013 (πριν από 3 χρόνια και 10 μήνες)

150 εμφανίσεις

CHAP 14.
프로세스와

스레드

©
2012
생능출판사

All rights reserved

다중

스레딩


하나의

애플리케이션이

동시에

여러

가지

작업을







이들

작업은

스레드
(thread)
라고

불린다
.


©
2012
생능출판사

All rights reserved

안드로이드에서의

프로세스와

스레드


애플리케이션이

시작되면

안드로이드

시스템은


로운

리눅스

프로세스를

생성한다
.



기본적으로

애플리케이션

안의

모든

컴포넌트들은

동일한

프로세스의

동일한

스레드로

실행된다
.





기본적인

스레드를

메인

스레드
⡭慩渠瑨牥慤t



부른다
.

©
2012
생능출판사

All rights reserved

메인

스레드


메인

스레드는

사용자

인터페이스

위젯에게

이벤트


전달하거나

화면을

그리는

작업을

담당


UI
스레드
⡵獥s 楮瑥牦慣攠瑨牥慤t
라고도

불린다
.




©
2012
생능출판사

All rights reserved

안드로이드의

단일

스레드

모델

원칙


UI
스레드는

블록시키면

안된다



UI
스레드

외부에서

안드로이드

啉U
툴킷을

조작하면

안된다
.



©
2012
생능출판사

All rights reserved

작업

스레드


별도로

생성되는

스레드


배경

스레드

⠢扡b歧k潵湤n 瑨牥慤
)
라고도

한다
.

©
2012
생능출판사

All rights reserved

작업

스레드를

작성하는

방법


Thread
클래스를

상속받아서

스레드를

작성하는






Runnable
인터페이스를

구현한

후에

周牥慤T
객체에

전달하는

방법


©
2012
생능출판사

All rights reserved

T
HREAD

상속방법

...

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
);




}



}


}

©
2012
생능출판사

All rights reserved

T
HREAD

상속방법


public

void

onCreate
(Bundle
savedInstanceState
) {



super
.onCreate
(
savedInstanceState
);



setContentView
(
R.layout.
main
);


}


@Override


public

void

onStart
() {



super
.onStart
();



w

=
new
WorkerThread
();



running

=
true;



w
.start
();


}


@Override


public

void

onStop
() {



super
.onStop
();



running

=
false;


}

}

©
2012
생능출판사

All rights reserved

실행

결과

©
2012
생능출판사

All rights reserved

R
UNNABLE

인터페이스를

구현

방법

...

public

class

ThreadTest

extends

Activity {


Thread
w;


boolean

running

=
true;


@Override


public

void

onCreate
(Bundle
savedInstanceState
) {



super
.onCreate
(
savedInstanceState
);



setContentView
(
R.layout.
main
);


}

©
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;


}

}

©
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/image.png"
);


mImageView.setImageBitmap
(b);



}













}).
start
();

}


주의할




스레드에서

직접적으로

사용자

인터페이스

위젯을

변경하면



된다
.


©
2012
생능출판사

All rights reserved

해결할



있는

3
가지

방법


Activity.runOnUiThread
(Runnable
)


View.post
(Runnable
)


View.postDelayed
(Runnable
, long)


©
2012
생능출판사

All rights reserved

V
IEW
.
POST
(R
UNNABLE
)
사용

public void

onClick
(View v
) {





new

Thread(
new

Runnable
() {









public void

run
() {













final Bitmap
bitmap

=




loadImageFromNetwork
("
http://example.com/image.png
");













mImageView.post
(new Runnable
() {

















public void run
() {





















mImageView.setImageBitmap
(bitmap);

















}













});









}





}).
start();

}

©
2012
생능출판사

All rights reserved

H
ANDLER


사용

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
);



}


}

}

©
2012
생능출판사

All rights reserved

H
ANDLER


사용

...

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
();


}

}

©
2012
생능출판사

All rights reserved

실행

결과

©
2012
생능출판사

All rights reserved

H
ANDLER

클래스를

사용하는

방법


러너블

객체를

UI
스레드로

보낼



있다
.

©
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
>

©
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
);



//

©
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();


}

}

©
2012
생능출판사

All rights reserved

실행

결과

©
2012
생능출판사

All rights reserved

A
SYNC

클래스

사용

방법


AsyncTask

클래스는

1.5
버전부터

추가된

클래스로


작업

스레드와

관련된

복잡한

부분을

쉽게

처리
해주는

클래스


©
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);




}



});


}

©
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
);



}


}

}

©
2012
생능출판사

All rights reserved

실행

결과