간혹가다 옆에 레이아웃에 변경된게 안뜰때 오류해결법
apptheme -> appcompatdaynight으로변경해주기
본격적으로 만들어보자!
activity.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"
android:orientation="horizontal"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="스레드 시작"
android:layout_weight="1"
/>
<Button
android:id="@+id/btn_stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="스레드 종료"
android:layout_weight="1"
/>
</LinearLayout>
스레드란? : 백그라운드에서 작업을 할 수 있는 기능을 가지고있음.
흔이 앱을 사용하다가 홈버튼을 누르고 잠깐 밖으로 빠져있을때 백그라운드 상태로 들어가게되는데 그때 처리해줄 수 있는 구문이나 일련의 프로세스 작업들을 해줄 수 있음
Main에 앞서 지정한 버튼을 선언
Button btn_start, btn_stop;
Thread thread;
boolean isThread = false;
트루나 폴스로만 지정할 수 있음. 이게 뭐임 근데?
Boolean
불린(Boolean)은 참과 거짓을 의미하는 데이터 타입으로 bool이라고도 부른다. 불린은 정수나 문자와 같이 하나의 데이터 타입인데, 참을 의미하는 true와 거짓을 의미하는 false 두 가지의 값을 가지고 있다. 아래는 비교 연산자들에 대한 설명이다.
XML id 속성
xml의 id 속성은 화면에 대한 View의 행동을 추가하기 위해 Java 코드를 만질 때 id 값을 xml에서 부여하고 부여된 id 값을 토대로 .java 코드에서 해당 객체를 사용할 수 있게 한다.
기본적인 사용법은
위젯 변수 = (위젯 명) findViewById(R.id.위젯_id); 의 형태를 사용하면 된다.
위젯 변수에 findViewById로 view의 최상위 클래스인 view 클래스로 받으므로 사용할 위젯이 속한 class로 형변환을 해주면 된다.
출처:https://wonit.tistory.com/161
MainActivity.js
package com.example.threadexample;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
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); //일시정지해라 = 5000(5초) 동안 쉬어라.
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(0);
//핸들러가 스레드인 동안에는 5초동안 쉬었다가 핸들러를 수행해라 라는 뜻 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;
}
});
}
//Ctrl+O사용
//isThread 가 false가 될때까지 5초마다 핸들러 실행해라
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Toast.makeText(getApplicationContext(),"촬리의 어플이다.",Toast.LENGTH_SHORT).show(); //5초마다 핸들러값인 토스트를 실행해줘라 라는 뜻
}
};
}
Thread.sleep()과 InterruptedException에 대한 자세한 설명
try -catch문 에 대한 설명
Thread와 Handler란?
앱을 구현할 때 하나의 기능이 실행되는 중 다른 기능이 동시에 실행되어야 할 때가 있다.
예를 들어 우리가 게임을 하는 동안에 동시에 채팅도 할 수 있게 구현하고 싶다면 Thread를 사용하면 된다.
Thread를 사용하면 현재 실행되고 있는 코드와 별도로 시스템에서 자원을 할당하여 동시에 실행시켜 준다.
프로젝트를 생성하면 Main Thread 하나로 작동하며, 여기에 다른 Thread를 추가하여 사용할 수 있다.
동시에 여러 기능을 수행한다면 Service를 사용하면 되지 않을까 라고 생각할 수 있다.
여러 차이가 있지만 Service는 UI가 없이 동작하는 반면, Thread는 UI에 접근하여 수정하는 것이 가능하다.
이 때 여러 가지 Thread가 동시에 UI에 접근함으로써 Deadlock과 같은 Concurrency Problem이 발생할 수 있다.
이를 방지하기 위해 안드로이드에서는 Handler를 통해 UI에 접근하도록 하고 있다.
Handler는 Message Queue를 이용하여 Main Thread에서 순차적으로 코드를 수행할 수 있게 해준다.
다른 Thread에서 Message를 통해 요청을 보내면 Main Thread의 Handler에서 Message Queue에 담는다.
이렇게 Message Queue에 담긴 요청들을 문제가 발생하지 않도록 순차적으로 실행하게 된다.
출처:https://ju-hy.tistory.com/62
결과
5초마다 메시지뜨는거 확인가능
'✍2021,2022 > app(android studio)' 카테고리의 다른 글
앱만들기 .16(Service 백그라운드 음악) (0) | 2021.07.19 |
---|---|
앱만들기. 15(Dialog) (0) | 2021.07.17 |
앱만들기.13(Log출력,주석다는법) (0) | 2021.07.17 |
앱만들기.12(fragment) (0) | 2021.07.14 |
1+2주차 개념정리,복습 (0) | 2021.07.14 |