핸들러를 이용한 스레드 구현 (1): http://qlyh8.tistory.com/83?category=726548


앞서 말한 방법으로는, 뷰에 접근할 때마다 새로운 핸들러를 정의하고 handleMessage() 에서 UI 접근 코드를 만들어야 하며

데이터를 메시지 객체로 만들어서 전달해야 하기 때문에 복잡하다.

이를 개선하기 위한 핸들러의 좀 더 쉬운 이용 방법이 있다.



1. MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.tistory.qlyh8.pracitice;
 
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity  {
 
    TextView textView;
    Button button;
    Handler handler = new Handler();    // 핸들러 일반 객체를 사용한다.
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        textView = findViewById(R.id.text_view);
 
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Runnable 객체를 구현하여 스레드 생성
                new Thread(new Runnable() {
                    boolean isRunning = false;
                    int value = 0;
 
                    @Override
                    public void run() {
                        isRunning = true;
                        while(isRunning){
                            value += 1;
 
                            // post() 메소드를 호출하여 Runnable 객체를 전달한다.
                            // postAtTime(): 지정된 시간에 실행하는 메서드 
                            // postDelayed(): 지정된 시간만큼 딜레이 된 후 실행하는 메서드
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    // value 객체가 핸들러로 전달된다.
                                    // 핸들러 내부에서 실행되기 때문에, 이는 곧
                                    // 메인 스레드에서 실행되기 때문에 UI 접근이 가능하다.
                                    textView.setText("현재 값 : "+  value);
                                }
                            });
 
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start(); // 스레드 실행
            }
        });
    }
}
cs


2. 참고
- Communicating with the UI Thread
- 안드로이드 백그라운드 잘 다루기 Thread, Looper, Handler



출처: https://www.edwith.org/boostcourse-android/lecture/17086

'Android' 카테고리의 다른 글

소켓 (Socket) - 1. 소켓이란  (0) 2018.07.25
AsyncTask  (0) 2018.07.25
스레드 (Thread) - 2. 핸들러를 이용한 스레드 구현 (1)  (0) 2018.07.24
스레드 (Thread) - 1. 스레드와 핸들러  (0) 2018.07.24
Context (컨텍스트)  (0) 2018.07.20

+ Recent posts