본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/Thread

Android Studio Thread 1

by 차누감 2019. 9. 19.

●Thread - Code를 실행하는 객체

 

간단한 예제를 해보자.

버튼을 누르면 TextView에 숫자를 카운트하는 것을 만들어 보자

첫 번째 버튼은 Main Thread가 카운트하게 만들고

두 번째는 Thread가 동작하면서 다른 동작도 가능한지 확인을 위해 그냥 만듬

세 번째는 (첫 번째 버튼을 누르고, 두번째 버튼이 동작이 안된다.. 그걸 가능하게 새로운 Thread 사용하는방법)

 

우선 화면을 먼저 디자인 하자
activity_main.xml 코드
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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="오래걸리는 작업(Thread 미사용)ANR에러"
        android:textAllCaps="false"
        android:onClick="clickBtn"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="오래걸리는 작업수행(Thread 사용)"
        android:onClick="clickBtn2"/>
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="30sp"
        android:textStyle="bold"
        android:gravity="center"/>
</LinearLayout>
 
 

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 
import androidx.annotation.NonNull;
 
 
public class MainActivity extends AppCompatActivity {
 
    TextView tv;
    int num=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        tv=findViewById(R.id.tv);
    }
    //첫 번째 버튼
    public void clickBtn(View view) {
        //오래걸리는 작업(ex. Network.. file IO..
        //별도의 Thread를 사용하지 않았으므로 Main Thread가 처리함.
        for(int i=0; i<20;i++){
            num++;
            tv.setText(num+"");
            //0.5초간 대기
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }//for
    }//clickBtn method..
 
    //두 번째 
    public void clickBtn2(View view) {
        //오래걸리는 작업수행하는 직원 객체(MyThread) 생성 및 실행
        MyThread t =new MyThread();
        t.start(); //자동으로 run() 실행
 
 
    }
 
    //오래 걸리는 작업을 수행하는 스레드의 설계
    class MyThread extends Thread{
        @Override
        public void run() {
            //이 직원 객체가 해야할 작업을 코딩
 
            //오래걸리는 작업
            for(int i=0;i<20; i++){
                num++;
 
                //화면에 num값 출력////
                //UI변경작업은 반드시 Main Thread만 할 수 있음.
                //[실행하는 디바이스의 android버전이 pie버전(api29)부터 UI변경이 가능함]
 
                //별도 스레드에서 UI변경작업을 하려면..
                //반드시 MainThread에게 변경을 요청해야함
 
                //방법1. Handler를 이용하는 방법
//                handler.sendEmptyMessage(0);// 인자 값은 식별 번호 (int 임의)
 
                //방법2. Activity클래스의 메소드인 runOnUiThread()를 이용하는 방법
                //방법1은 handler의 내용이 한눈에 들어오지 않으므로 불편하므로 handler 사용 x
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //이 Runnable스레드는
                        //Main Thread의 위임장을 받았기에
                        //UI변경이 가능함
                        tv.setText(num+"");
                    }
                });
 
 
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
 
 
        }// run method..
    }//MyThread class ..
 
    //MainActivity의 멤버 변수
    Handler handler= new Handler(){
        //snedEmptyMessage()가 호출되면
        //자동으로 실행되는 메소드
        //이 메소드안에서 UI변경 작업이 가능함.
        @Override
        public void handleMessage(@NonNull Message msg) {
            tv.setText(num+"");
        }
    };
 
}//MainActivity class..
 
 
 

<실행 화면>

첫 번째 버튼 누를 시

첫 번째 버튼을 누르면 10초동안 저 상태로 아무것도 안된다... Main Thread가 카운트를 하기 때문에

그리고 10초가 지나면 바로 0 숫자는 20으로 바뀐다... 나는 0~20까지 카운트를 보고 싶은데

그래서!!!

별도의 스레드로 동작하는 세 번째 버튼을 만들었다.

바로바로 카운트 되는 것을 확인할 수 있고, 카운트 되는 동안

두 번째 버튼을 클릭해도 작동이 된다.( 첫 번째 버튼은 안됨.. 그 차이를 알자)

댓글