✍2021,2022/app(android studio)

앱만들기. 14(Thread & Handler )

리촬리 2021. 7. 17. 15:24
728x90

간혹가다 옆에 레이아웃에 변경된게 안뜰때 오류해결법

 

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에 대한 자세한 설명

 

Java InterruptedException은 어따 쓰는겨?

Thread.sleep()과 InterruptedException자바 개발자라면 Thread.sleep() 메서드를 한번쯤은 써봤을 것이다. 이 메서드는 제품 단계의 코드에서는 잘 쓰이지 않지만 테스트 코드 등에서 어떤 로직이 실행될 때

happinessoncode.com

try -catch문 에 대한 설명

 

[Java] 자바 예외처리 Try Catch문 사용법

 Error(에러)와 Exception(예외의 차이) 에러(Error)란 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 이상이 생겼거나 JVM 실행에 문제가 생겼을 경우 발생하는것을 말합니다. 이 경우

coding-factory.tistory.com

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초마다 메시지뜨는거 확인가능

 

 

728x90