Efficient Android Threading #5 기본 스레드의 생명주기 관리
이 글은 Efficient Android Threading 의 일부 내용만 발췌한 내용입니다.
자세한 내용은 책을 구입해서 보세용.
7.1. 기본 사항
** 7.1.1. 생명주기
-
스레드는 다음의 생명 주기를 갖는다.
생성 : 스레드를 생성한 스레드와 동일한 우선순위로 할당된다.
실행 : start() 가 호출될 때 실행 환경이 설정되고 실행될 준비가 된다. 이후 스케줄러가 이 스레드를 선택하면 run 메서드가 호출된다.
차단/대기 : sleep(), yield() 등이 수행되었을 때이다.
종료 : run 메서드가 종료된 상태이다. 최종상태에며 Thread 인스턴스나 실행 환경은 재사용 할 수 없다.
** 7.1.2. 인터럽트
-
현재 차단된 스레드가 인터럽트되면 InterruptException 을 던진다.
InterruptException 이 던져지면 인터럽트 플래그가 재설정된다. 다시 말해 스레드가 중단되었다가 InterruptException 에 의해 깨어나서 isInterrupted 함수를 호출하면 false 를 반환한다.
-
isInterrupted 는 flag 값만 확인하지만, interrupted 함수는 flag 값을 return 후 초기화한다.
-
Thread.stop() 은 사용하지 않아야 한다.
공유 객체를 비일관적이고 예측 불가능하게 만든다.
** 7.1.3. 잡히지 않은 예외
-
스레드에서의 Exception 은 눈에 띄지 않을 수 있다.
Thread 에서의 Exception 도 잡아내려면, UncaughtExceptionHandler 를 부착하는 것이 좋다.
Thread 의 static, instance method 로 setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) 함수가 있다.
static, instance 모두 있다면 instance method 로 전달된 handler 가 우선시되어 호출되고, static method 를 통해 전달한 handler 는 호출되지 않는다.
-
안드로이드 런타임은 전역 UncaughtExceptionHandler 를 프로세스에 부착한다.
따라서 예외 핸들러는 앱 안의 모든 스레드에 연결되고, 모든 스레드에 대해 동등하게 처리되지 못한 예외(unhandled exception)을 다룬다.
즉, 프로세스를 죽인다.
UncaughtExceptionHandler 를 user 가 define 한것으로 사용할 수 있는데, 이 때 uncaughtException callback 에서는 기존에 설정된 Thread.getDefaultUncaughtExceptionHandler() 를 의 uncaughtException 을 호출해주는 것이 좋다.
7.2. 스레드 관리
** 7.2.1. 정의와 시작
** 7.2.2. 유지
-
스레드로 어떤 연산을 하던 도중 orientation change 와 같이 activity 재생성이 되는 경우, 기존 activity 에서 생성한 thread 를 유지 할 수 있다.
-
액티비티에서의 스레드 유지는 다음 2가지 메서드를 통해 한다.
public Object onRetainNonConfigurationInstance()
이 메서드는 config change 전에 플랫폼에서 호출된다.
구현내용은 설정 변경 동안 유지되고, 새로운 Activity 객체에 전달하고자 하는 객체(예를 들어 스레드)를 반환해야 한다.
public Object getLastNonConfigurationInstance()
설정 변경이 이루어진 후 onRetainNonConfigurationInstance() 에서 반환된 유지된 객체를 가져오기 위해 새로운 Activity 객체에서 호출한다.
onCreate 나 onStart 에서 호출할 수 있고 액티비티가 설정 변경이 아닌 다른 이유로 시작되면 null 을 반환한다.
-
프레그먼트에서 스레드 유지를 하는 방법은 Fragment.onCreate() 에서 setRetainInstance(true) 를 호출하는 것이다.
이렇게 하면 프로그먼트는 설정 변경 동안 유지된다.
Thread 유지를 위해 빈 프래그먼트에 Thread 로직( 혹은 UI 없이 다른 로직들도.. )만 넣어 사용하기도 한다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
Efficient Android Threading #7 Executor 프레임워크를 통한 스레드 실행 제어 (0) | 2018.03.23 |
---|---|
Efficient Android Threading #6 핸들러 스레드 : 고수준 큐 메커니즘 (0) | 2018.03.22 |
Efficient Android Threading #4 메모리 관리 (0) | 2018.03.20 |
Efficient Android Threading #3 프로세스 간 통신 (0) | 2018.03.19 |
Efficient Android Threading #2 스레드 통신 (0) | 2018.03.18 |
댓글