[Android] 44 - 3.스레드 사용하기(코드), 핸들러 사용 ★★
여기서부터 시작함.
-결과는 같음-
"핸들러"를 사용하는게 좀 복잡하다,,
UI를 접근하는게, 이전 블로그에서처럼 TextView만 접근하는게 아니라,
프로그래스바 등등 접근할 수 있는게 많은데요...
이런 상황들이 앞으로 여러개가 있을 수가 있습니다.
근데, 그럴때마다
계속 "새로운 핸들러"를 정의를 하고 handleMessage() 안에서
각각의 케이스별로해서 UI접근하는 것을 만들어 주어야 한다.
그 다음에,
이 데이터를 Message객체로 만들어서 또 전달 해주어야한다라고 하면,
좀 복잡해 지겠죠!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
그러다 보니깐, 앞에 블로그에서 했던 방식말고
더 쉽게 코드를 짤 수 있는 방법이 있습니다.
그리고 이전 블로그처럼 실제 실전에서 쓴다면, ,,,,, 답이 없다.(너무 복잡해 지니깐)
좀더 단순한 형태로 쓸 수 있는 방식이 있습니다.
뭐냐면!!
앞에 방식은 Handler을 상속해서 했잖아요!!(밑에 그림 처럼)
"핸들러"를 상속하지말고!!
"핸들러"라고 하는 일반 객체를 쓰는 방법으로 하면 됩니다.
근데 "핸들러"를 일반 객체로 사용해서 쓸려면 일딴,
Tread를 따로 클래스 만들지 말고,
Thread구현한 방법을 Runnable() 사용방법으로 바꿔줘야 한다.(밑에 그림처럼)
그리고 이 안에 이전 블로그에서 사용 했던 BackgroundThread클래스 의 코드들을 알맞게 넣어주면 됩니다.
그리고 이젠 여기서 value라는 것을 TextView에 표시를 해주어야 하는데,
근데, 표시를 해줄 때, 직접 접근을 할 수가 없잖아요!!!
그래서
"핸들러"를 사용을 합니다. 근데 이전 블로그에서 사용 했던 ValueHandler(Handler상속해서 만든거)말고
그냥 Hander를 바로 객체로 만듭니다. (밑에 이미지)
post()라는 것은 무언가를 던지다 라는 것입니다.
post() 안에 new Runnable()을 넣어줍니다. (밑에 그림)
textView.setText("현재 값 : "+textView);
이렇게 해서 UI에 접근을 할 수가 있습니다. (밑에 그림)
근데 textView.setText("현재 값 : "+textView);이 코드는 UI(TextView)에 접근은 하지만,
handler2(핸들러)=Handler객체 라는 쪽으로 전달되는 객체가 되구요.
Handler객체 내부에서 실행 되는 코드가 된다는 말 입니다!!.
그리고 중요한거,
Runnable() 안에 들어간 textView이고,
그리고 Runnable()객체가 handler2(핸들러)=Handler객체 쪽으로 전달됩니다.
그래서 마찬가지로
이 textView.setText("현재 값 : "+textView); 코드를 작성한 곳 위치에서도
UI를 접근을 할 수 있게 됩니다!!! (중요!중요!중요!)
왜냐하면 "메인 스레드"에서 접근이 되기 때문에 입니다.
- 끝 -
이전 블로그랑 비교하면
이전 블로그 |
현재 블로그(바꾼거) |
1. 핸들러를 상속해서 핸들러클래스를 만듬. 2. sendMessage() 그다음에 3. handleMessage() 이용해서
처리하던 복잡하던 코드가 였습니다 |
1. Handler handler2 = new Handler(); 2. 4줄만 추가가 되면
값(UI)를 쉽게 바꿀 수가 있는 코드가 됩니다! |
전체 코드 - (바꾼거)
1.Handler 생성(상속해서 클래스 만들지 말고 그냥 Handler 자체 객체 생성함!)
2.Thread()안에 Runnable() 새로 만들고 그 안에서 run() ㄱㄱ
3.그 안에 handler2 넣고 post()가 하는게 Handler() 자체로 던지는거임
(sendMessage() ,handleMessage() 이런거 안써도 된다는 거!!!, 알아서 해준다는 거)
4.그리고 post() 안에 Runnable() 새로 만들어서
(UI 업데이트 해주고 싶은거 해주면 됨!)
(x표시 한것이 이전 블로그로 한 거임. 저거 돌려도 실행 됨.)
- 정리 -
스레드를 사용하면서 UI객체에 접근하고 싶다면 "핸들러"를 사용한다라는 것을 알아야 합니다.!!
그런데 Message객체를 사용하면 코드가 많아져서 코드를 해석하기 어렵다는 문제가 생깁니다.
post메소드를 사용하면 매우 좋긴 하지만 이것보다 좀 더 사용하기 쉬운 방법이 더 없을까하는 생각이 들게 됩니다.
근데 있습니다.
AsyncTask!!!!!!
AsyncTask는 하나의 클래스 안에 스레드로 동작하는 부분과 UI객체에 접근하는 부분을 함께 넣어둘 수 있도록 합니다.
이 때문에 스레드를 사용하는 하나의 작업 단위가 하나의 클래스로 만들어 질 수 있죠.
AsyncTask 사용 방법
ㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱ
[Android] 44 - 5.스레드 사용하기(코드), AsyncTask 사용
'■ Android > Tip' 카테고리의 다른 글
[Android] 20 - 2.소켓(핸들러 사용) - "클라이언트"의 UI 업데이트 (0) | 2020.02.12 |
---|---|
[Android] 10 - 5.스레드 사용하기(코드), AsyncTask 사용 ★ (0) | 2020.02.10 |
[Android] 10 - 3.스레드 사용하기(코드), 핸들러 사용 ★ (0) | 2020.02.08 |
[Android] 10 - 2.스레드 사용하기(설명) (0) | 2020.02.08 |
[Android] 10 - 1.설명(앞으로 할거 대충 설명) (0) | 2020.02.08 |