본문 바로가기
프로그래밍/Android

Android Main Thread UI처리 관련 팁.

by Mr-후 2018. 10. 16.
반응형


Android Main Thread UI처리 관련 팁.




몇일동안 안드로이드 애니메이션 작업을 하고 있다. 

메인 메뉴에 약간의 애니메이션을 넣는 작업인데 생각보다 어렵다. 안드로이드가 익숙하지 않은 이유도 있지만 수학적 공식과 난해한 좌표계산은 일찍이 포기한 상태라 더 그런 것 같다. 


우여곡절 끝에 외부 라이브러리를 이용해 원하는 애니메이션을 적용할 수 있었는데 이것 저것 소스를 onCreate()안에 집어 넣었더니 애니메이션의 좌표점 계산이 눈에 보이면서 버벅되는 현상이 나왔다. 


왜 이런걸까? 하고 @Override 되는 몇몇 메서드를 살펴보니 UI작업을 하는 메서드들이 여기저기서 호출되고 있었다. 

@Override 되는 onMeasure()와 onLayout()등이 지속적으로 호출이 되는데 onCreate()와 상관이 있는 것으로 판단. 


애니메이션을 위한 메뉴작업과 화면 UI작업을 병행하다보니 버벅되는 것 같다는 생각이 들어 애니메이션 추가 작업을 화면 UI작업을 다 한 뒤에 메인 스레드에 추가해 주는 작업을 하는 방식으로 변경해보았다. 다행스럽게도 버벅되는 현상 없이 깔끔하게 처리가 되어 안드로이드의 메인 스레드에 대한 자료를 찾아 학습을 하고 몇 몇 방안 중, 대표적인 방법으로 기록을 해 둔다. 


아이폰, 안드로이드 비슷하겠지만 스레드는 하나의 프로세스 내에서 여러가지 작업을 동시 또는 순차적으로 처리하기 위해 사용되는 자원인데 보통 다음과 같은 방식으로 사용한다. 


Thread thread = new Thread(new Runnable() {

@Override

public void run() {

//TODO

}

}).start(); 


서브 스레드에서 UI관련 작업을 하면 안된다고 명시한다. 아이폰, 안드로이드 둘다 같다. UI관련 작업은 자원의 동기화를 위해 메인 스레드에서 처리가 되도록 해야하는데 메인 스레드에 있는 메시지 큐에 UI작업이나 메시지 처리 루틴을 handMessage메서드에 정의해서 전달하면 메인 스레드의 핸들러가 순서대로 처리한다. 




new Thread(new Runnable() {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {

/**
* 메인애니메이션 메뉴 설정
*/

}
});
}
}).start();

Main Thread에 기본적으로 Looper와 MessageQueue가 존재하므로 MainActivity에서 위의 코드를 이용해 Handler객체를 생성 후 바로 쓰레드를 실행시키면 정상적으로 동작을 한다. 


여러가지 안드로이드의 라이프사이클 메서드로 해결을 해보려다가 메인 스레드에 post()을 이용하는 방법을 선택(?) 했다. 


관련 정리가 잘 된 사이트 링크을 아래에 걸어둔다. 


다른 쓰레드에서 UI처리를 하는 방법 (https://devlab.neonkid.xyz/posts/android/Android,-%EB%8B%A4%EB%A5%B8-%EC%93%B0%EB%A0%88%EB%93%9C%EC%97%90%EC%84%9C-UI-%EC%B2%98%EB%A6%AC%EB%A5%BC-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95.html)



반응형