반응형
●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"?>
xmlns:app="http://schemas.android.com/apk/res-auto"
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
|
package com.lcw.ex31thread;
import androidx.annotation.NonNull;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
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까지 카운트를 보고 싶은데
그래서!!!
별도의 스레드로 동작하는 세 번째 버튼을 만들었다.
바로바로 카운트 되는 것을 확인할 수 있고, 카운트 되는 동안
두 번째 버튼을 클릭해도 작동이 된다.( 첫 번째 버튼은 안됨.. 그 차이를 알자)
반응형
'안드로이드 웹앱 콘테츠 개발자 양성(국비지원) > Thread' 카테고리의 다른 글
Android Studio Thread 4 (0) | 2019.09.19 |
---|---|
Android Studio Thread3 (0) | 2019.09.19 |
Android Studio Thread 2 (0) | 2019.09.19 |
댓글