android - separate thread
*memory leak 참고: http://blog.nimbledroid.com/2016/05/23/memory-leaks.html
*GC(Garbage Collection)알고리즘
http://d2.naver.com/helloworld/1329
-stop-the-world:GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
-JAVA에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에
가비지 컬렉터가 더이상 필요없는 객체를 찾아 지우는 작업을 한다
*android memory leak 사례
https://medium.com/@joongwon/android-memory-leak-사례-6565b817a8fe
Java의 일반적인 객체: strong reference
GC대상을 선정하는 과정에서 reachable, unreachable로 나뉨
reachable: root set으로부터 시작된 참조 사슬에 포함되어있으면
unreachable: 참조 사슬에 자신을 참조하고 있는 reachable객체 없는 경우
->자신을 참조하고 있는 객체(reachable)가 있는 경우, GC 대상이 되지 않는다
non-static inner class의 경우, outer class에 대한 reference를 가지고 main thread에서 생성하였기 때문에 main thread에 바인딩 된다.
그러므로 outer class가 종료됐지만 delay된 작업이 남아 있고, inner class에서 outer class에 대한 reference가 남아있기 때문에 outerclass는 GC대상이 아니다
...(뒷부분은 이해가 가지 않는다...)
*android 백그라운드 잘 다루기 thread, looper, handler
https://academy.realm.io/kr/posts/android-thread-looper-handler/
안드로이드 UI는 기본적으로 싱글 스레드
여분의 스레드를 사용해야 함, 다른 스레드에서 UI스레드로 접근할 수 있는 스레드간 통신
Looper와 Handler 사용, Handler Thread, AsyncTask
1)Looper, Handler

1-1)handler
Handler 객체는 하나의 스레드와 해당 스레드의 Message Queue에 종속된다.
Handler 객체를 새로 생성하면 해당 스레드와 Message Queue에 바인딩된다.
외부 혹은 자기 스레드로부터 받은 메세지를 어떤 식으로 처리할 지는 handleMessage()로 구현
sendMessage()나 post()로 특정 Handler에게 메세지 전달하거나, 재귀적인 호출도 가능해서,
딜레이를 이용한 타이머나 스케줄링 역할 할 수 있다.
1-2)Looper와 Message Queue
Looper는 무한히 루프를 돌며 자신이 속한 스레드의 Message Queue에 들어온 Message나 Runnable 객체를 차례로 꺼내서 이를 처리할 Handler에게 전달한다.
메인스레드는 Looper가 기본적으로 생성되어 있지만, 새로 생성한 스레드는 가지고 있지 않고, run메서드만 실행 후 종료하기 때문에 메시지를 받을 수 없다.
따라서 기본 스레드에서 메시지 전달받으려면:
prepare()메서드를 통해 Looper 생성 >>
loop()메서드를 통해 Looper가 무한히 루프를 돌며 Message Queue에 쌓인 Message나 Runnable 객체를 꺼내서>>
Handler에 전달하도록 한다.>>
이렇게 활성화된 Looper는 quit()이나 quitSafely()메서드로 중단 가능하다
quit(): Looper 즉시 종료
quitSafely(): 현재 Message Queue에 쌓인 메시지를 처리한 후 종료
1-3)Message, Runnable
*Message: 스레드 간 통신할 내용을 담는 객체이자 Queue에 들어갈 일감의 단위
*Runnable:스레드의 run()메서드를 분리한 것
-스레드를 만드는 두가지 방법
---Thread()로 생성>>내부적으로 run()구현
---Thread(Runnable runnable):Runnable interface를 구현한 객체를 생성하여 전달
---Runnable inteface는 run()추상 메서드를 가지고 있기 때문에 run()코드 반드시 구현해야됨
*결론:
Message는 스레드간 통신할 내용을 담는다(int, Object)
Runnable은 실행할 run()메서드와 그 내부 실행될 코드를 담는다.
1-4) HandlerThread
:스레드 생성할 때 Looper를 자동으로 보유한 클래스
:일반적으로 스레드를 확장한 클래스, Looper가짐,자동으로 Looper내부의 Message Queue도 생성됨,이를 통해 Message나 Runnable을 전달받을 수 있음
1-5)AsyncTask
*하나의 클래스에서 UI작업과 background작업을 쉽게 할 수 있도록 제공된 class
*안드로이드 버전 별로 병렬 처리 동작다름
>>허니콤 이후 버전에서 멀티 스레드로 병렬적인 동작을 원한다면 AsyncTask.THREAD_POOL_EXECUTOR 스케줄러 지정해야됨
*GC(Garbage Collection)알고리즘
http://d2.naver.com/helloworld/1329
-stop-the-world:GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
-JAVA에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에
가비지 컬렉터가 더이상 필요없는 객체를 찾아 지우는 작업을 한다
*android memory leak 사례
https://medium.com/@joongwon/android-memory-leak-사례-6565b817a8fe
Java의 일반적인 객체: strong reference
GC대상을 선정하는 과정에서 reachable, unreachable로 나뉨
reachable: root set으로부터 시작된 참조 사슬에 포함되어있으면
unreachable: 참조 사슬에 자신을 참조하고 있는 reachable객체 없는 경우
->자신을 참조하고 있는 객체(reachable)가 있는 경우, GC 대상이 되지 않는다
non-static inner class의 경우, outer class에 대한 reference를 가지고 main thread에서 생성하였기 때문에 main thread에 바인딩 된다.
그러므로 outer class가 종료됐지만 delay된 작업이 남아 있고, inner class에서 outer class에 대한 reference가 남아있기 때문에 outerclass는 GC대상이 아니다
...(뒷부분은 이해가 가지 않는다...)
*android 백그라운드 잘 다루기 thread, looper, handler
https://academy.realm.io/kr/posts/android-thread-looper-handler/
안드로이드 UI는 기본적으로 싱글 스레드
여분의 스레드를 사용해야 함, 다른 스레드에서 UI스레드로 접근할 수 있는 스레드간 통신
Looper와 Handler 사용, Handler Thread, AsyncTask
1)Looper, Handler

1-1)handler
Handler 객체는 하나의 스레드와 해당 스레드의 Message Queue에 종속된다.
Handler 객체를 새로 생성하면 해당 스레드와 Message Queue에 바인딩된다.
외부 혹은 자기 스레드로부터 받은 메세지를 어떤 식으로 처리할 지는 handleMessage()로 구현
sendMessage()나 post()로 특정 Handler에게 메세지 전달하거나, 재귀적인 호출도 가능해서,
딜레이를 이용한 타이머나 스케줄링 역할 할 수 있다.
1-2)Looper와 Message Queue
Looper는 무한히 루프를 돌며 자신이 속한 스레드의 Message Queue에 들어온 Message나 Runnable 객체를 차례로 꺼내서 이를 처리할 Handler에게 전달한다.
메인스레드는 Looper가 기본적으로 생성되어 있지만, 새로 생성한 스레드는 가지고 있지 않고, run메서드만 실행 후 종료하기 때문에 메시지를 받을 수 없다.
따라서 기본 스레드에서 메시지 전달받으려면:
prepare()메서드를 통해 Looper 생성 >>
loop()메서드를 통해 Looper가 무한히 루프를 돌며 Message Queue에 쌓인 Message나 Runnable 객체를 꺼내서>>
Handler에 전달하도록 한다.>>
이렇게 활성화된 Looper는 quit()이나 quitSafely()메서드로 중단 가능하다
quit(): Looper 즉시 종료
quitSafely(): 현재 Message Queue에 쌓인 메시지를 처리한 후 종료
1-3)Message, Runnable
*Message: 스레드 간 통신할 내용을 담는 객체이자 Queue에 들어갈 일감의 단위
*Runnable:스레드의 run()메서드를 분리한 것
-스레드를 만드는 두가지 방법
---Thread()로 생성>>내부적으로 run()구현
---Thread(Runnable runnable):Runnable interface를 구현한 객체를 생성하여 전달
---Runnable inteface는 run()추상 메서드를 가지고 있기 때문에 run()코드 반드시 구현해야됨
*결론:
Message는 스레드간 통신할 내용을 담는다(int, Object)
Runnable은 실행할 run()메서드와 그 내부 실행될 코드를 담는다.
1-4) HandlerThread
:스레드 생성할 때 Looper를 자동으로 보유한 클래스
:일반적으로 스레드를 확장한 클래스, Looper가짐,자동으로 Looper내부의 Message Queue도 생성됨,이를 통해 Message나 Runnable을 전달받을 수 있음
1-5)AsyncTask
*하나의 클래스에서 UI작업과 background작업을 쉽게 할 수 있도록 제공된 class
*안드로이드 버전 별로 병렬 처리 동작다름
>>허니콤 이후 버전에서 멀티 스레드로 병렬적인 동작을 원한다면 AsyncTask.THREAD_POOL_EXECUTOR 스케줄러 지정해야됨
댓글
댓글 쓰기