레이블이 안드로이드인 게시물을 표시합니다. 모든 게시물 표시
레이블이 안드로이드인 게시물을 표시합니다. 모든 게시물 표시

2010년 1월 21일 목요일

Android 에서 Handler와 Message 란?

Android(안드로이드) 개발시 사용되는 Handler(핸들러)와 통신에 사용되는 Message(메시지)에 대해서 알아보자.

 

핸들러란?

 

안드로이드의 시스템은 사용자가 작성한 UI에서 빠른 응답을 요구하고 있다.

만약 5초 이상의 응당이 없을 경우 최악의 경우 작성된 프로그램이 강제로 종료가 되는 경우도 발생할 수 있다.

이런 상황을 방지하기 위해서 시간이 오래걸리는 작업이 필요한 경우 두가지의 방법으로 해결을 할 수 있다.

첫번째는 시간이 오래걸리는 작업은 서비스로 만들어서 처리하는 방법

두번째는 새로운 쓰레드로 처리를 하는 방법

 

두번째 방법으로 쓰레드를 생성해서 데이터 처리등의 시간이 오래걸리는 작업을 지원하기 위한 클래스가 존재하는데 그것이 핸들러(Handdler)이다.

 

간략하게 요약을 해보면

  • 백그라운드 쓰레드 생성을 위한 가장 유연한 방법이다.
  • 인스턴스 생성시 자동으로 안드로이드가 실행 관리한다.
  • 메시지를 전달받게 되면 호출 되는 handlerMessage()에 실제 처리내용을 구현한다.
  • post(), postDelayed()를 통해서 인자로 실행하고 자하는 Runnable객체를 전달할 수 있다.
  • View단에도 Runnable객처를 인자로 전달가능하고 이럴경우 코드가 심플해지는 경우도 있을수 있지만 Handler를 추천한다.

 

 

메시지(Message)란?

 

UI등에서 실제로 처리를 담당하는 쓰레드로 데이터를 전송하거나 작업을 요청하기 위해서 전달하는 객체이다.

 

  • 핸들러로 전달되는 객체이다.
  • 전달된 메시지는 메시지 Queue를 통해서 핸들러가 가져다 사용한다.
  • 메시지를 전달하기 위해선 핸들러의 obtainMessage()호출해서 메시지 풀의 메시지를 획득해서 전달해야한다.
  • 메시지를 전달하기 위해서는 sendMessage() 등을 사용한다.

 

메시지 전달 방식의 종류

  • sendMessage() - 큐의 마지막에 메시지를 삽입한다.
  • sendMessageAtFrontQueue() - 큐의 맨앞에 메시지를 삽입한다.(우선처리)
  • sendMessageAtTime() - 장비기동시간을 기준으로 삽입한다.(SystemClock.uptimeMillis()참고)
  • sendMessageDelayed() - 특정시간만큼 지연 삽입한다.

 

 

2009년 12월 31일 목요일

에뮬레이터(Emulator) 기동시 AVD 에러 해결방법

안드로이드(Android) SDK를 설치하고 에뮬레이터를 기동시에

아래와 같은 에러가 나타나는 경우가 있다.

 

emulator: ERROR: unknown virtual device name: 'Test-AVD'
emulator: could not find virtual device named 'Test-AVD'


 

위와 같은 문제는 에뮬레이터와 안드로이드 툴킷의 설정 문제이다.

 

위와 같은 상황일때에는 Win+R 을 눌러서 Cmd명령을 입력해서

커맨드 창을 열고

echo %USERPROFILE% 를 입력해서 출력되는 내용을 보면

필자는 아래와 같이 C드라이브로 설정되어 있고

 

실제로 사용하고 있는 유저의 프로파일 경로는 아래와 같이 E드라이브를 사용하고 있다.

 

에뮬레이터는 C로 만들어진 어플리케이션으로 %USERPROFILE%를 참고해서 AVD를 찾고

안드로이드툴은 Java로 만들어진 어플리케이션으로 실제 사용중인 프로파일 경로의 .android

폴더를  참조하게 된다. 이러한 차이로 AVD를 찾지 못하는 것이다.

 

이것을 해결하기 위한 방법은 여러가지로 제시가 되고 있지만 최고의 방법은

 

아래와 같이 환경변수에 ANDROID_SDK_HOME을 설정하는 것이다.

 

위와 같은 설정을 하게 되면 .android폴더가 지정한 경로의 하위 폴더로 설정되어 AVD들이

동일한 곳에 저장되어 툴킷과 에뮬레이터가 같은 곳을 참조하게 되므로

문제를 해결할 수 있다.