Do it! 안드로이드 앱프로그래밍 9일차 (19.04.17)

2019. 4. 17. 16:21Engineer/안드로이드 앱 프로그래밍

반응형



 Chapter 07. 스레드와 애니메이션 


   07-1 핸들러 사용하기


스레드(Thread)는 동시 수행이 가능한 작업 단위이며, 현재 수행되는 작업 이외의 기능을 동시 처리하고자 할 때 새로운 스래드를 만들어 처리할 수 있다. 멀티 스레드 방식은 같은 프로세스 안에 들어 있으면서 메모리 리소스를 공유하게 되므로 효율적인 처리가 가능하지만 동시에 리소스에 접근할 경우에 데드락(DeadLock)이 발생하여 시스템이 비정상적으로 동작할 수 있다. 


메인 스레드 : 안드로이드에서 UI 처리를 위해 사용되는 기본 스레드


새로 생성한 스레드에서는 핸들러 객체를 이용해 메시지를 전달함으로써 메인 스레드에서 처리할 수 있도록 한다. 


Thread 클래스의 생성자는 크게 파마리터가 없는 경우와 Runnable 객체를 파라미터로 가지는 두가지가 있다. 


앱을 실행하면 프로세스가 만들어지고 그안에 메인 스레드가 생성되고 최상위에서 관리되는 애플리케이션 구성 요소인 액티비티, 브로드캐스트 수신자, 등과 새로 만들어지는 윈도우를 관리하기 위한 메시지 큐(Message Queue)를 실행하게 된다. 


메시지큐를 이용해 메인 스레드에서 처리할 메시지를 전달하는 역할을 담당하는 것이 핸들러 클래스이다. 



새로 생성한 스레드가 수행하려는 정보를 메인 스레드로 전달하는 방법

  1. 핸들러가 관리하는 메시지 큐에서 처리할 수 있는 메시지 객체 하나를 참조. obtainMessage( )메소드를 이용
  2. 메시지 객체에 필요한 정보를 넣은 후 sendMessage( )메소드를 이용해 메시지 큐에 전달
  3. 메시지큐에 들어간 메시지는 순서대로 핸들러가 처리하게 되며 이때 handleMessage( ) 메소드에 정의된 기능이 수행됨. 
핸들러 클래스는 메시지 전송을 통하여 메인 스레드에서 실행하는 방법 이외에 Runnable 객체를 실행시킬 수 있는 방법을 제공한다. 새로 만든 Runnalbe 객체를 핸들러의 post( )메소드를 이용해 전달해 주기만 하면 이 객체에 정의된 run( ) 메소드 내의 코드들은 메인 스레드에서 실행된다. 


   07-2 일정 시간 후에 실행하기


핸들러는 메시지 큐를 사용하므로 메시지들을 순서대로 처리하지만 메시지를 넣을 대 시간을 지정하면 원하는 시간에 메시지를 처리하도로 만들 수 있으므로 일정 시간 후에 실행시킬때 사용할 수 있다. 시간을 지정하는 경우에 사용하는 해들러의 메소드는 아래와같다. 


Runnable 객체를 실행하는 post( ) 메소드의 경우에도 postAtTime( )과 postDelayd( )메소드가 있어 동일한 기능을 수행한다. 



   07-3 스레드로 메시지 전송하기


핸들러가 처리하는 메시지 큐는 루퍼(Looper)를 통해 처리되는데 그 과정은 일반적인 이벤트 처리 과정과 유사하다. 루퍼는 무한루프 방식을 이용해 메시지 큐에 들어오는 메시지를 지속적으로 보면서 하나씩 처리한다. 


메인 스레드나 다른 스레드에서 메시지 전송 방식으로 스레드에 데이터를 전달한 후 작업을 순차적으로 수행하고 싶다면 루퍼를 만든후 실행 해야 한다. 



   07-4 AsyncTask 사용하기


새로만든 스레드에서 UI 객체를 컨트롤하기 위해 핸들러를 사용하면서 코드가 조금 복잡해 지는 문제가 생긴다. 이런 백그라운드 작업을 좀 더 쉽고 간단하게 할 수 있는 것이 AsyncTask 클래스를 사용하는 것이다. 


AsyncTask 클래스를 상속하여 새로운 클래스를 만들면 그안에 스레드를 위한 코드와 UI 접근 코드를 한꺼번에 넣을 수 있다. 따라서 스레드로 처리해야 하는 코드를 각각의 AsyncTask 클래스로 정의할 수 있다는 장점이 있다. 


AsyncTask 객체를 만들고 excute( ) 메소드를 실행하면 이 객체는 정의된 백그라운드 작업을 수행하고 필요한 경우에 그결과를 메인 스레드에서 실행하므로 UI 객체에 접근하는 문제가 없게된다. 



   07-5 스레드로 애니메이션 만들기


스레드를 이용하여 여러 이미지를 연속으로 바꾸면서 애니메이션 효과를 만들 수 있다. 


스레드 안에서 직접 이미지를 변경하지 않는 간단한 방법으로는 ImageSwitcher 클래스를 이용하여 여러개의 이미지를 교체하면서 보여주고 싶을 때 유용하게 사용할 수 있다. 



   07-6 트윈 애니메이션


트윈 애니메이션 : 보여줄 대상을 적절하게 연산한 후 그 결과를 연속적으로 디스플레이 하는 방식으로, 애니메이션 대상과 변환방식을 지정하면 애니메이션 효과를 낼 수 있도록 만들들어 준다. 따라서 프레임 애니메이션처럼 변경하면서 보여줄 각각의 이미지를 추가할 필요 없이 대상만 지정하면 시스템이 내부적으로 적절하게 연산 과정을 거친다. 


트윈 애니메이션을 위한 액션(Action) 정보는 XML 리소스로 정의하거나 자바 코드에 직접 객체로 만들 수 있다. 애니메이션을 위한 XML 파일은 [/res/anim]폴더의 밑에 두어야 한다. 


XML로 저장하는 애니메이션 액션은 여러개이 효과를 하나로 묶어 동시에 수행되도록 만들 수 있으며 이때는 <set>태그를 상용하여 여러 애니메이션 액션을 포함시킨다. 



   07-7 그래프 애니메이션 만들기


프로그레스바를 이용하여 그린 그래프 또는 뷰 위에 직접 그린 그래프를 보여줄 때 그 그래프가 움직이는, 즉 애니메이션을 적용할 수 있다. 






반응형