thread는 동시작업을 하기 위해 필요한 작업단위이다. 참고로 외부스레드를 사용하지 않은 상태는 메인스레드 상태다. thread를 사용하는 이유는 여러 동작을 함께 할 때 꼭 필요하기때문이다. 대표적인 예로는 타이머가 있다. 타이머를 작동시키며 백그라운드 상태에서 다른 일을 할 수 있는건 바로 thread 덕분이다.
그러나 thread를 구현하는데 있어서 주의할 점이 있다. xml 부분에서 thread 여러개가 동시에 접근할 수 없다. 그렇기에 기본적인 메인스레드만 xml부분은 UI에 접근할 수 있고 다른 스레드들은 handler와 같은 별도의 제어롤 통해 다뤄야 한다.
https://www.youtube.com/watch?v=aYjdfpit6lc&list=PLC51MBz7PMyyyR2l4gGBMFMMUfYmBkZxm&index=17
(1) activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
tools:context=".MainActivity"
android:orientation="horizontal">
<Button
android:id="@+id/btn_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="스레드 시작"/>
<Button
android:id="@+id/btn_stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="스레드 종료"/>
</LinearLayout>
이번 강의를 통해 스레드 시작 버튼을 누르면 화면에 글자가 몇 초 간격으로 보이도록 구현하고 스레드 종료 버튼을 누르면 스레드를 종료하는 법을 배워보았다.
(2) MainActivity.java
package com.example.threadexam;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
Button btn_start, btn_stop;
Thread thread;
boolean isThread = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 스레드 시작
btn_start = (Button)findViewById(R.id.btn_start);
btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isThread = true;
thread = new Thread() {
public void run(){
while(isThread){
try {
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(0);
}
}
};
thread.start();
}
});
// 스레드 종료
btn_stop = (Button)findViewById(R.id.btn_stop);
btn_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isThread = false;
}
});
}
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
Toast.makeText(getApplicationContext(), "태윤", Toast.LENGTH_SHORT).show();
}
};
}
● '스레드 시작' 버튼을 누름으로써 스레드 작동하기
btn_start.setOnClickListener함수를 통해 '스레드시작' 버튼을 누르면 함수가 실행되게끔 하였다.
isThread 초기값은 false로 설정했는데 true면 스레드가 계속 진행되고 false면 스레드를 멈추게끔 하였다.
run()함수를 통해 isThread가 true면 5초 간격으로 handler.setEmptyMessage가 실행되게끔 한다.
(handler 함수는 맨 밑에 handleMessage함수를 작동시키게끔 구현했다.)
thread.start(); 함수를 넣어줌으로써 thread가 실행될 수 있게 해준다.
● '스레드 종료' 버튼을 누름으로써 스레드 멈추기
'스레드 종료' 버튼을 누르면 isThread 값을 false로 정하여 스레드를 멈춘다.
※ 실행화면
'study & bootcamp > 안드로이드 앱 스터디' 카테고리의 다른 글
[Android App 개발 스터디] Notification 예제 (0) | 2021.08.13 |
---|---|
Android App 개발 스터디 #16 Dialog 다이얼로그 팝업창 (0) | 2021.08.10 |
Android App 개발 스터디 #12 RecyclerView편 및 RecyclerView 입력 글자가 표시되도록 바꾸어보기 (0) | 2021.08.04 |
Android App 개발 스터디 #14 Log출력 및 주석 다는 법 (0) | 2021.08.04 |
Android App 개발 스터디 #13 Fragment편 (0) | 2021.08.03 |