Thread 1 Thread Thread v thread v activitymain

  • Slides: 53
Download presentation
Thread 1

Thread 1

Thread

Thread

Thread v 프로젝트를 생성(thread) v activity_main. xml 파일 수정 <Linear. Layout xmlns: android="http: //schemas.

Thread v 프로젝트를 생성(thread) v activity_main. xml 파일 수정 <Linear. Layout xmlns: android="http: //schemas. android. com/apk/res/android" android: layout_width="match_parent" android: layout_height="match_parent" android: orientation="vertical" > <Text. View android: text="Hello World!" android: layout_width="wrap_content" android: layout_height="wrap_content" android: id="@+id/txt" android: layout_center. Vertical="true" android: layout_center. Horizontal="true" /> <Button android: layout_width="wrap_content" android: layout_height="wrap_content" android: text="버튼을 누르세요" android: id="@+id/btn" android: layout_center. Horizontal="true" android: layout_margin. Top="51 dp" android: on. Click="click" android: text. All. Caps="false" /> </Linear. Layout>

Thread v Main. Activity. kt 파일에 메소드 추가 fun click(view: View? ) { try

Thread v Main. Activity. kt 파일에 메소드 추가 fun click(view: View? ) { try { Thread. sleep(2000) } catch (e: Exception) { } txt. text = "버튼을 눌렀습니다. " }

Thread v Thread 구현 ü Thread 클래스를 상속 class Thread. Ex : Thread(){ override

Thread v Thread 구현 ü Thread 클래스를 상속 class Thread. Ex : Thread(){ override fun run() {} } val thread. Ex = Thread. Ex() thread. Ex. start() ü Runnable 인터페이스를 구현 class My. Thread: Runnable { override fun run() { } } val runnable = My. Thread() val thread = Thread(runnable) thread. start()

Thread

Thread

Thread v Main. Activity. kt 파일 수정 – Main Thread에서 주기적인 UI 갱신: 마지막

Thread v Main. Activity. kt 파일 수정 – Main Thread에서 주기적인 UI 갱신: 마지막 한번만 수행하는 것처럼 동작 var value : Int = 0 fun click(view: View? ) { while (value < 20) { value++ try { Thread. sleep(1000) Log. e("Value", "${value}") txt. set. Text("Value : ${value}") } catch (e: Interrupted. Exception) { return } } }

Thread v Main. Activity. kt 파일 수정 – 별도의 Thread에서 주기적인 UI 갱신 class

Thread v Main. Activity. kt 파일 수정 – 별도의 Thread에서 주기적인 UI 갱신 class Main. Activity : App. Compat. Activity() { var value : Int = 0 inner class Back. Thread : Thread() { override fun run() { while (value < 20) { value++ try { sleep(1000) txt. set. Text("Value : $value") } catch (e: Interrupted. Exception) { return } } override fun on. Create(saved. Instance. State: Bundle? ) { super. on. Create(saved. Instance. State) set. Content. View(R. layout. activity_main) }

Thread v Main. Activity. kt 파일 수정 – 별도의 Thread에서 주기적인 UI 갱신 fun

Thread v Main. Activity. kt 파일 수정 – 별도의 Thread에서 주기적인 UI 갱신 fun click(view: View? ) { val th: Thread = Back. Thread() th. is. Daemon = true th. start() } }

Handler

Handler

Handler v Main. Activity. kt 파일 수정 – Handler 이용 class Main. Activity :

Handler v Main. Activity. kt 파일 수정 – Handler 이용 class Main. Activity : App. Compat. Activity() { var value : Int = 0 var handler: Handler = object : Handler(Looper. get. Main. Looper()) { override fun handle. Message(msg: Message) { if (msg. what === 0) { txt. text = "Value : $value" } } }

Handler v Main. Activity. kt 파일 수정 – Handler 이용 inner class Back. Thread

Handler v Main. Activity. kt 파일 수정 – Handler 이용 inner class Back. Thread : Thread() { override fun run() { while (value < 20) { value++ try { sleep(1000) //txt. set. Text("Value : $value") handler. send. Empty. Message(0); } catch (e: Interrupted. Exception) { return } }

Handler v Main. Activity. kt 파일 수정 – Handler 이용 override fun on. Create(saved.

Handler v Main. Activity. kt 파일 수정 – Handler 이용 override fun on. Create(saved. Instance. State: Bundle? ) { super. on. Create(saved. Instance. State) set. Content. View(R. layout. activity_main) } } fun click(view: View? ) { val th: Thread = Back. Thread() th. is. Daemon = true th. start() }

Handler v Handler 와 Thread 코드를 수정 var handler = Handler(Looper. get. Main. Looper())

Handler v Handler 와 Thread 코드를 수정 var handler = Handler(Looper. get. Main. Looper()) inner class Back. Thread : Thread() { override fun run() { while (value < 20) { value++ handler. post { txt. text = "value : $value" } Thread. sleep(1000) } } }

Handler

Handler

Handler v 실행 가능한 Activity 추가(Handler. Activity) v activity_handler. xml 파일 수정 <? xml

Handler v 실행 가능한 Activity 추가(Handler. Activity) v activity_handler. xml 파일 수정 <? xml version="1. 0" encoding="utf-8"? > <Linear. Layout xmlns: android="http: //schemas. android. com/apk/res/android" android: orientation="vertical" android: layout_width="match_parent" android: layout_height="match_parent" > <Text. View android: layout_width="match_parent" android: layout_height="wrap_content" android: text="업로드를 시작하려면 다음 버튼을 누르세요. " /> <Button android: id="@+id/upload" android: layout_width="wrap_content" android: layout_height="wrap_content" android: on. Click="click" android: text="업로드" /> </Linear. Layout>

Handler v Handler. Activity. kt 파일에 메소드 추가 fun click(v: View? ) { Alert.

Handler v Handler. Activity. kt 파일에 메소드 추가 fun click(v: View? ) { Alert. Dialog. Builder(this). set. Title("질문"). set. Message("업로드 하시겠습니까? "). set. Positive. Button("예", Dialog. Interface. On. Click. Listener { dialog, which. Button -> do. Upload() }). set. Negative. Button("아니오", null). show() } fun do. Upload() { for (i in 0. . 9) { try { Thread. sleep(1000) } catch (e: Interrupted. Exception) { } } Toast. make. Text(this, "업로드를 완료했습니다. ", 0). show() }

Handler

Handler

Handler v Main. Activity. kt 파일에 메소드 추가 – 메시지 전달 기법을 이용하여 해결

Handler v Main. Activity. kt 파일에 메소드 추가 – 메시지 전달 기법을 이용하여 해결 fun click(v: View? ) { Alert. Dialog. Builder(this). set. Title("질문"). set. Message("업로드 하시겠습니까? "). set. Positive. Button( "예" ) { dialog, which. Button -> m. Handler. send. Empty. Message. Delayed(0, 10) }. set. Negative. Button("아니오", null). show() } var m. Handler: Handler = object : Handler(Looper. get. Main. Looper()){ override fun handle. Message(msg: Message) { if (msg. what === 0) { do. Upload() } } }

Handler v Main. Activity. kt 파일에 메소드 추가 – 메시지 전달 기법을 이용하여 해결

Handler v Main. Activity. kt 파일에 메소드 추가 – 메시지 전달 기법을 이용하여 해결 fun do. Upload() { for (i in 0. . 19) { try { Thread. sleep(100) } catch (e: Interrupted. Exception) { } } Toast. make. Text(this, "업로드를 완료했습니다. ", Toast. LENGTH_SHORT). show() }

Handler v Main. Activity. kt 파일의 버튼 클릭 메소드 수정 – Runnable을 이용하여 해결

Handler v Main. Activity. kt 파일의 버튼 클릭 메소드 수정 – Runnable을 이용하여 해결 fun click(v: View? ) { Alert. Dialog. Builder(this). set. Title("질문"). set. Message("업로드 하시겠습니까? "). set. Positive. Button( "예" ) { dialog, which. Button -> val btn. Upload: Button = find. View. By. Id<View>(R. id. upload) as Button btn. Upload. post. Delayed(Runnable { do. Upload() }, 10) }. set. Negative. Button("아니오", null). show() }

Handler

Handler

Handler v 실행 가능한 Activity 추가(Progress. Activity) v activity_progress. xml 파일 수정 <? xml

Handler v 실행 가능한 Activity 추가(Progress. Activity) v activity_progress. xml 파일 수정 <? xml version="1. 0" encoding="utf-8"? > <Linear. Layout xmlns: android="http: //schemas. android. com/apk/res/android" android: orientation="vertical" android: layout_width="match_parent" android: layout_height="match_parent" > <Text. View android: id="@+id/text" android: layout_width="match_parent" android: layout_height="wrap_content" android: text="0" android: text. Size="40 sp" /> <Button android: id="@+id/update" android: layout_width="wrap_content" android: layout_height="wrap_content" android: on. Click="click" android: text="Update" /> </Linear. Layout>

Handler v Progress. Activity. kt 파일 수정 – 메소드에서의 UI 변경 class Progress. Activity

Handler v Progress. Activity. kt 파일 수정 – 메소드에서의 UI 변경 class Progress. Activity : App. Compat. Activity() { var value = 0 override fun on. Create(saved. Instance. State: Bundle? ) { super. on. Create(saved. Instance. State) set. Content. View(R. layout. activity_progress) } fun click(v: View? ) { value = 0 update() }

Handler v Progress. Activity. kt 파일 수정 – 메소드에서의 UI 변경 fun update() {

Handler v Progress. Activity. kt 파일 수정 – 메소드에서의 UI 변경 fun update() { for (i in 0. . 99) { value++ text!!. text = Integer. to. String(value) try { Thread. sleep(50) } catch (e: Interrupted. Exception) { } }

Handler v Progress. Activity. kt 파일 수정 – Handler 이용 fun click(v: View? )

Handler v Progress. Activity. kt 파일 수정 – Handler 이용 fun click(v: View? ) { value = 0 handler. send. Empty. Message(0) } var handler: Handler = object : Handler(Looper. get. Main. Looper()) { override fun handle. Message(msg: Message) { value++ text!!. text = Integer. to. String(value) try { Thread. sleep(50) } catch (e: Interrupted. Exception) { } if (value < 100) { this. send. Empty. Message(0) } } }

Handler

Handler

Handler v Progress. Activity. kt 파일 수정 class Progress. Activity : App. Compat. Activity()

Handler v Progress. Activity. kt 파일 수정 class Progress. Activity : App. Compat. Activity() { var value = 0 var m. Progress: Progress. Dialog? = null var is. Quit = false override fun on. Create(saved. Instance. State: Bundle? ) { super. on. Create(saved. Instance. State) set. Content. View(R. layout. activity_progress) }

Handler v Progress. Activity. kt 파일 수정 fun click(v: View? ) { value =

Handler v Progress. Activity. kt 파일 수정 fun click(v: View? ) { value = 0 m. Progress = Progress. Dialog(this) m. Progress!!. set. Progress. Style(Progress. Dialog. STYLE_HORIZONTAL) m. Progress!!. set. Title("Updating") m. Progress!!. set. Message("Wait. . . ") m. Progress!!. set. Cancelable(false) m. Progress!!. show() is. Quit = false handler. send. Empty. Message(0) }

Handler v Progress. Activity. kt 파일 수정 val handler : Handler = object :

Handler v Progress. Activity. kt 파일 수정 val handler : Handler = object : Handler(Looper. get. Main. Looper()) { override fun handle. Message(msg: Message) { value++; text? . set. Text(Integer. to. String(value)); try { Thread. sleep(50); } catch (e: Interrupted. Exception ) {; } if (value < 100 && is. Quit == false) { m. Progress? . set. Progress(value); this. send. Empty. Message(0); } else { m. Progress? . dismiss(); } }

Handler v activity_progress. xml 파일 수정 <? xml version="1. 0" encoding="utf-8"? > <Linear. Layout

Handler v activity_progress. xml 파일 수정 <? xml version="1. 0" encoding="utf-8"? > <Linear. Layout xmlns: android="http: //schemas. android. com/apk/res/android" android: orientation="vertical" android: layout_width="match_parent" android: layout_height="match_parent" > <Progress. Bar android: layout_width="match_parent" android: layout_height="wrap_content" style="? android: attr/progress. Bar. Style. Horizontal" android: max="100" android: id="@+id/progress" /> <Text. View android: id="@+id/text" android: layout_width="match_parent" android: layout_height="wrap_content" android: text="0" android: text. Size="40 sp" />

Handler v Progress. Activity. kt 파일 수정 fun click(v: View? ) { value =

Handler v Progress. Activity. kt 파일 수정 fun click(v: View? ) { value = 0 is. Quit = false handler. send. Empty. Message(0) } } val handler : Handler = object : Handler(Looper. get. Main. Looper()) { override fun handle. Message(msg: Message) { value++ text? . set. Text(Integer. to. String(value)) try { Thread. sleep(50); } catch (e: Interrupted. Exception ) {; } if (value < 100 && is. Quit == false) { //m. Progress? . set. Progress(value) progress? . set. Progress(value) this. send. Empty. Message(0) } else { //m. Progress? . dismiss() } } }