Android #13 - Thread (국비39일차)

 

오늘은 Thread에 대해서 공부해 볼 것이다.

Thread에 대한 개념이 아예 없는 사람은

2023.02.02 - [Android journey/Java] - Java #11 - Thread, runnable, 익명클래스, 동기화 (국비 23일 차)

 

Java #11 - Thread, runnable, 익명클래스, 동기화 (국비23일차)

오늘은 Thread에 대해서 주로 공부할 것이다. 목차 1. Thread 2. Runnable 3. 익명클래스 4. 동기화 5. 스레드의 기능들 1. Thread Thread - 작성된 코드를 실행하는 객체 - 동시에 여러 작업을 하고 싶을 때 쓰

d0ngurrrrrrr.tistory.com

위 글을 읽고 오는 게 도움이 될 수 있다.

 

목차

1. Thread란?
2. Thread의 필요성
3. Thread 사용법
4. Thread를 이용해 이미지 로드하기

 

 

 

 

 

 

1. Thread란?

Thread : 코드를 읽어서 실행하는 객체

스레드란 동시작업을 하기 위한 하나의 작업 단위라고 할 수 있다.

 

예를 들자면

밥을 만들 때 취사버튼을 눌러놓고

다른 찌개를 만드는 것과 같은 것이다.

위의 예와 같이 무언가를 백그라운드로 돌려놓고

다른 여러 작업을 하는 것이라고 할 수 있다.

 

이를 앱에서 예를 들자면

노래 스트리밍을 들으면서 

카톡을 할 수 있는 것이다.

 

 

2. Thread의 필요성

 

만약, 이 Thread 작업을 하지 않는다면 어떻게 될까?

가정을 하나 해보자.

thread가 없는 상황에서 핸드폰으로

하나의 영상을 받는 상황이 있다고 해보자.

영상의 용량이 크다면

유저는 다운로드가 완료될 때까지 다른 작업을 할 수 없다..

 

또 만약 어떤 버튼이 있는데 이 버튼을 눌렀는데

폰이 작업 완료하는데 10초 넘게 걸린다고 가정해 보자.

그럼 유저는 10초 넘게 쳐다만 보고 있어야 하며

안드로이드에선 일정 시간 이상 메인 스레드가

그 태스크에 잡혀있으면 ANR(Android Not Responding) 에러가 난다.

 

그러기에 thread 작업은 여러 방면에서 많이 사용되니

반드시 숙지가 필요한 파트다.

 

3. Thread 사용법

 

 

thread를 사용해 보기 위해

간단히 버튼 하나와

텍스트뷰를 만들자.

 

위와 같은 느낌으로 만들었다.

이제 버튼을 누르면 텍스트뷰의 숫자가

1초당 1씩 오르게 만들 것이다.

 

우선 참조변수를 선언하고

btn에 리스너를 달아주자.

그리고 MyThread 객체를 만들고

start() 명령을 내려주자.
(이 객체는 이제 아래에서 만들 예정)

 

 

이제 오래 걸리는 작업을 수행할 Thread 객체를 만들어보자.

Thread 클래스를 상속받은 객체를 만들고

반복문을 통해 num에 1초에 한 번씩 1씩 더해질 수 있게 하자.
(이를 위해 sleep 명령을 사용)

하지만 이 Thread에서 바로 텍스뷰에 setText를 시킬 순 없다.
(UI 작업은 메인 스레드만 하도록 되어있기 때문이다.)

그래서 runOnUiThread라는 메소드를 사용한다. 이 메소드를 사용하면 문제가 해결된다. 이 안에 setText를 이용해서 num 값을 화면에 출력하면 되고

1초간 잠재우기를 하기 위해
sleep 명령을 하였다.

 

 

 

만약 방법 1인

Handler 객체를 사용하고 싶다면
(이 방법은 예전에 자주 쓰였으나 요즘은 runOnUiThread를 자주 사용)

Thread객체 안에 handler.sendEmptyMessage(0);을 쓰고

 

따로 handler객체를 만들어준 뒤

그 안에 setText를 해야 한다.

 

그러면 검은 버튼을 누르면

1초마다 1씩 상승하는 작업을 하면서

다른 버튼도 누를 수 있게 된다.

 

 

4. Thread를 이용해 이미지 로드하기

 

 

이번엔 Thread를 이용해서

버튼을 누르면

인터넷에 있는 사진을 

앱으로 가져와보자.

 

메인 스레드에서 네트워크 작업을 하지 않는 이유는

시간 지연 때문이다.

그래서 따로 스레드를 만들어서

작업을 시킨다.

먼저 버튼과

이미지를 보여줄 이미지뷰를 만든 후

androidmanifest.xml로 간다.

여기에서 <application 부분 위에

인터넷 사용에 대한 퍼미션을 받아야 한다.

<uses-permission을 사용해 internet에 대한 퍼미션을 받도록 하자.
(인터넷 접속은 과금이 부과될 수 있으니.. 퍼미션을 받도록
안드로이드에서 설정해 둠..)

 

그리고 <application 마지막 부분에

usesClearTextTraffic 값을 true 작성해 주자.

 

메인 자바 클래스로 와서

참조변수를 선언하고

리스너를 만든 후

리스너 안에 넣은

메소드를 만들자.

clickBtn이란 이름으로 만든 후

안에 새로운 thread를 만들고

run 메소드를 오버라이드 하자.

 

그 안에 이미지 주소를 넣을

String 참조변수를 만들어두자.

 

이미지는 pixabay로 가서

spring과 관련된 이미지를 검색했다.

 

그리고 맘에 드는 이미지를 찾아 오른쪽 클릭 후

이미지 주소를 복사해서

그 참조변수 안에 넣어준다.

 

이후 자바에서 했던 것처럼

Stream을 이용해서

사진을 불러오게 한다.
(stream은 try/catch문이 필수다.)

그리고 UI는 메인 스레드에서만 가능하므로

runOnUiThread를 사용해서

setImage를 해준다.

 

만일 이 과정을 잘 모르겠다면 아래 글을 참조하자.

2023.02.03 - [Android journey/Java] - Java #12 - Stream, 바이트스트림, 문자스트림 (국비 24일 차)

 

Java #12 - Stream, 바이트스트림, 문자스트림 (국비24일차)

1. Stream 이란? 2. 바이트 스트림 1. 파일에 데이터 넣기 2. 파일 읽어오기 3. 파일 복사하기 프로그램 3. 문자 스트림 1. Stream 이란? 우선 Stream이라는 단어의 뜻을 살펴보면 시냇물이 흘러가는 느낌의

d0ngurrrrrrr.tistory.com

 

이 부분은 stream 관련 코드를 작성했을 때

빨간 줄이 나온 부분에 커서를 올리면

try/catch문을 넣으라는 말이 나올 텐데

그 부분을 누르면 자동으로 만들어지는 코드다.

 

그럼 위에 LOAD IMAGE를 누르면

아래에 사진이 나타난다.

 

 

2023.02.24 - [Android journey/Android] - Android tip 1 - 라이브러리 추가

 

Android tip 1 - 라이브러리 추가

안드로이드엔 엄청 많은 라이버러리들이 있다. 이전에 사용했던 CircleImageView 같은 것이 그 중 하나다. 이전에는 gradle 파일에 직접들어가 했지만 이번에는 더 편하고 쉽게 하는 방법을 소개하도

d0ngurrrrrrr.tistory.com

이번엔 라이브러리를 사용해 보자.

위의 글대로 해서

Glide를 써보자.
(엄청 간단해짐)

 

위의 글처럼

버튼을 하나 더 만들어주고

onCreate메소드로 와서

버튼 2의 리스너를 만들어주자.

그리고 아까처럼

이미지 주소를 따와서

String 참조변수에 넣고

Glide.with(this).load(imgUrl).into(iv); 를

하면 끝이다.
(너무 쉽다...)

 

그 후 앱을 run 시켜서

아래 검은색 버튼을 누르면

사진이 나타난다.