안드로이드 스튜디오/Java

안드로이드 쓰레드(Thread2) Handler 사용

류창 2021. 11. 12. 17:24
반응형

저번에 멀티쓰레드를 사용해서, CalledFromWrongTrheadException이 발생했다.

 

이 오류는  서브 쓰레드가, 메인쓰레드의 UI를 조작하려들기때문에 발생하는오류다.

 

이번포스팅은 이 오류를 고쳐보겠다.

 

UI를 조작하려드는걸 막기위해서는

 

조작은 메인이하게 남겨두고, 서브쓰레드에선 조작할 값만 넘겨받으면된다.

 

이 기능을 용이하게 해주는것이

 

Thread 간 통신 방법
• Handler
• AsyncTask
• Deprecated in API level 30 (version R)
• Customized Handler
• RxJava (자바)
• Coroutines (코틀린)

 

방법들이있다.

 

이중에서 제일 기본적인 Handler를 사용해 보겠습니다.

 

Handler가 돌아가는 형태다.

 

메인쓰레드: Handler

미리 Handle handler; 를 작성해주세요

 

handler를 자동완성기능(Ctrl+Space)으로 쉽게 만듭시다.

 

서브쓰레드에서 전달받을 값은  Message msg 입니다.

 

1.저번에 만든 액티비티의 시간을 조작하기위해, time객체를 만듭시다.

 

2.msg는 Message타입이라, getData()로 빼옵니다.

  getData()로 빼오면 Bundle타입으로 바뀌는데, 이 Bundle타입을 다시 String타입으로 바꿉니다.

 

3.Bundle타입은 Key,Value로 구분하기에, 설정한 Key를 입력합니다.

 

4.그리고, setText로 메인쓰레드에서 조작.

 

 

멀티쓰레드

 

쓰레드 1장에서 바뀐건,

 

setText를 날려버리고, handelr에 메세지들을 보내버리는것이다.

 

1.Message, Bundel 객체를 만들고2.bundel에다 Key,Value형식으로 값을저장한다. 3.message에다 bundle을 넣는다.4.message를 Handler에 보낸다.

 

 

 

 

--------------------------------------------------------------------------------

 

 

 

 

여기까지 멀티스레드를 오류없이 설정하는법을 알아보았다.

 

하지만, Activity내에서만 멀티스레드를 사용하면 한계점이 있다.

 

EX)  Activity로 구현한 멀티스레드(file download Thread)로 파일을 다운로드한다고 가정하자.

 

사용자가 다운로드하다가, 메인쓰레드(어플종료)를 종료한다면, 다운로드가 끊겨버린다.(종료됨)

 

메인쓰레드가 꺼져도, 다운로드는 계속 백그라운드 형태로 진행되기 원한다면, 

 

4대Component인 Service가 필요하다.

 

이 Service는 나중에 다뤄보겠습니다. 

 

 

반응형