Louie NRT Story

[안드로이드] 잘못된 Thread 사용법 본문

전기차충전기

[안드로이드] 잘못된 Thread 사용법

hyeok0724.kim@gmail.com 2021. 12. 12. 13:45
반응형

작성일: 21년 12월 12일

PS. 프로젝트 진행하다보니 Thread를 사용할지 아니면 Service를 사용할지 고민하는 경우가 생김. 그때 판단의 기준이 되기 위해 작성함 

 

 

Index

1. Thread 코드

2. 동작 확인하기

3. 어플 종료하기

4. 어플 비정상 종료 시키기

5. 결론

 

 

1. Thread 코드

 1) MainActivity.java

  - "startThread()"를 누르면 Thread가 실행되면서 1초 주기로 mCount가 1씩 올라감

  - "stopThread()"를 누르면 Thread가 종료됨

public class MainActivity extends AppCompatActivity {
    private Thread mThread;
    private int mCount = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void startThread(View view) {
        if (mThread == null){
            mThread = new Thread("My Thread"){
                @Override
                public void run(){
                    for (int i = 0; i < 100; i++){
                        mCount++;
                        try{
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                            break;
                        }
                        Log.d("My Thread", "스레드 동작 중 " + mCount);
                    }
                }
            };
            mThread.start();
        }
    }

    public void stopThread(View view) {
        if (mThread != null){
            mThread.interrupt();
            mThread = null;
            mCount = 0;
        }
    }
}

 2) main_activity.xml

  - 버튼을 2개 만들어서 하나는 Thread를 실행시키고 다른 하다는 Thread를 종료 시킴

<?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="vertical"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="startThread"
        android:text="스레드 스타트"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="stopThread"
        android:text="스레드 중지"/>
</LinearLayout>

 

 

2. 동작 확인하기

 1) 동작된 화면

 2) Log 확인하기

  - 1초 주기로 mCount가 1씩 올라가는 것을 로그로 확인할 수 있음

 3) Thread 종료

  - Thread Interrupt가 발생하면서 Exception으로 빠지는 것을 확인 할 수 있음

 

 

3. 어플 종료하기

 - "back"버튼을 누름

 - Thread 실행 시키고 제대로 관리하지 않는 상황에서 어플을 종료하면 기존의 Thread는 종료되지 않고 계속 실행함

 - 어플을 다시 실행하여 Thread Start하면 또 다른 Thread가 생성되면서 Thread가 2개가 생성됨

 - 참고로 어플을 다시 실행하여 Thread Stop을 하더라도 종료가 되지 않음

 - 어플은 이미 뒤로가기 버튼을 눌러 스레드에 대한 참조가 삭제되어 기존의 Thread를 삭제 할 수 없음 

 

 

4. 어플 비정상 종료 시키기

 - 아래의 코드를 onCreate() 하위에 아래의 Thread를 생성함

 - mCount가 10이 되면 String 비교 하면서 어플이 비정상 종료됨

String makeError = null;

protected void onCreate(Bundle savedInstanceState) {

... 생략 ...

	Thread thTest = new Thread(){
            @Override
            public void run(){
                while(true){
                    if (mCount == 10){
                        if (makeError.equals("test")){
                            Log.d("ERROR", "발생 " + mCount);
                        }
                        else{
                            Log.d("ERROR", "실패 " + mCount);
                        }
                    }
                }
            }
        };
        thTest.start();

 - 앱 비정상 종료가 되었지만 스레드는 계속 돌아가고 있음을 알 수 있음 

 

 

5. 결론

 - Activity에 의존적이지 않는 컴포넌트로 만드는 것이 좋으므로 Service라는 것을 사용함

 

 

 

Referece:

https://youtu.be/IBm9D0KRJOk

 

반응형

'전기차충전기' 카테고리의 다른 글

[안드로이드] IntentService 만들기  (0) 2021.12.12
[안드로이드] Service 만들기  (0) 2021.12.12
[안드로이드] DataBinding  (0) 2021.12.09
[안드로이드] View Binding  (0) 2021.12.09
[안드로이드] Log 찍는 방법  (0) 2021.12.09
Comments