본문 바로가기
프로그래밍 놀이터/안드로이드, Java

Efficient Android Threading #5 기본 스레드의 생명주기 관리

by 돼지왕 왕돼지 2018. 3. 21.
반응형

Efficient Android Threading #5 기본 스레드의 생명주기 관리


이 글은 Efficient Android Threading 의 일부 내용만 발췌한 내용입니다.

자세한 내용은 책을 구입해서 보세용.

Callback, config change, Efficient Android Threading #5 기본 스레드의 생명주기 관리, empty fragment, exception, flag, fragment thread 유지, getDefaultUncaughtExceptionHandler, getLastNonConfigurationInstance, instance, instance method, INTERRUPT, interrupt flag, INTERRUPTED, interruptException, isInterrupted, onCreate, onRetainNonConfigurationInstance, onStart, run, setdefaultuncaughtexceptionhandler, setretaininstance, sleep, start, static, thread, thread 로직, thread 샐명주기, thread.stop, ui 없는 fragment, uncaughtexceptionhandler, unhandled exception, User, yield, 객체, 대기, 모든 프로세스, 생성, 설정 변경, 설정 변경 동안 유지, 스레드 유지, 스케줄러, 실행, 안드로이드 런타임, 액티비티 스레드 유지, 우선순위, 인터럽트, 인터럽트 플래그, 잡히지 않은 예외, 재사용, 종료, 차단, 초기화

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 없이 다른 로직들도.. )만 넣어 사용하기도 한다.







반응형

댓글