//또다른 관련링크 http://blog.naver.com/menusys?Redirect=Log&logNo=113357050
//출처: http://msinterdev.org/blog/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B8%B0%EC%B4%88-%EC%A0%95%EB%A6%AC
2-1. 백그라운드의 thread의 필요성
- 모든 콤포넌트는 하나의 Main thread위에서 동작한다.
- 따라서 시간이 많이 걸리는 작업을 하면 화면에 보이는 Activity뿐만아니라 다른 모든 콤포넌트까지 불록시킨다.
- 이때 "Application Unresponsive" 메시지가 출력될 것이다.
2-2 백그라운드 thread 활용 추천
- 입력 이벤트(키 눌림)에 대해서 5초 이내에 반응하지 않을 때
- onReceive 핸들러를 10초 이내에 완료하지 않는 Broadcast Receiver
- 이런 현상이 발생되는 주요 작업 사항으로는
. 파일작업
. 네트워크 조회
. 데이터베이스 트랜잭션
. 복잡한 계산
2-3 백그라운드 스레드 사용의 결론
- 느리고 시간이 많이 드는 모든 작업을 Main thread에서 Child thread로 옮기는 것이 좋은 습관이다.
2-4 새로운 thread와 GUI 작업을 위한 thread 동기화
- 골격 코드
01.
// GUI Handler 처리..
02.
private
Handler handler =
new
Handler();
03.
04.
// 이 메서드는 메인 GUI 스레드에서 호출된다.
05.
private
void
mainProcessing(){
06.
// 이는 시간이 많이 드는 작업을 자식 스레드로
옮긴다.
07.
Thread thread =
new
Thread(
null
,
doBackgroundThreadProcessing,
"Background"
);
08.
thread.start();
09.
}
10.
11.
// 백그라운드 처리 메서드를 실행하는 Runnable
12.
private
Runnable
doBackgroundThreadProcessing =
new
Runnable(){
13.
@Override
14.
public
void
run() {
15.
backgroundThreadProcessing();
16.
}
17.
};
18.
19.
// 백그라운드에서 몇 가지 처리를 수행하는 메서드
20.
private
void
backgroundThreadProcessing(){
21.
//[필요한 코드]
22.
// 처리가 끝나고 결과를 UI로 출력을 해야 할 때
아래 핸들러를 추가해서 사용한다.
23.
handler.post(doUpdateGUI);
24.
}
25.
26.
// GUI 업데이트 메서드를 실행하는 Runnable.
27.
private
Runnable doUpdateGUI =
new
Runnable(){
28.
@Override
29.
public
void
run() {
30.
updateGUI();
31.
}
32.
};
33.
34.
private
void
updateGUI() {
35.
// [[ 필요한 UI 코드 ]]
36.
}
Thread를 만드는 핵심 코드
private void mainProcessing(){
Thread thread = new
Thread(null, doBackgroundThreadProcessing,
"Background");
thread.start();
}
=>> Thread(ThreadGroup group, Runnable runnable, String threadName)
Thread와 GUI연결을 위한 핵심 코드
handler.post(doUpdateGUI);
- Handler를 사용하는 이유
Child Thread는 GUI를 갖고 있지 않다. 모든 GUI는 Main thread가 갖고 있어서 뷰, Toast등은 모두 Main thread에서 처리해야됨
따라서 handler를 통해서 child thread의 처리 결과를 Main thread에서 처리할 수 있게 해준다.
- Handler 클래스의 추가 메소드
. pastDelayed: 포스팅을 늦추어 처리한다. / handler.postDelayed(doUpdateGUI,5000)
. pastAtTime : 포스팅을 특정 시간에 실행하도록 한다.
- UIThreadUtilities 클래스
이 클래스는 runOnUIThread를 갖고 있어서 View, Activity, Dialog와 같은 thread에서 메소드를 강제적으로 실행해 줌
- Thread에서 꼭 기억해야 할 사항
다른 모든 경우에 있어, GUI스레드(뷰 같은)에서 생성된 객체와 명시적으로 상호작용하거나 메시지를 표시하는 작업은
메인 스레드에서 띄워져야만 한다."
'스마트기기개발관련 > 안드로이드 개발' 카테고리의 다른 글
안드로이드 스크린 키보드 있을때 back 버튼(되돌리기버튼) 이벤트 (11) | 2011.07.01 |
---|---|
안드로이드 기초 관련 (0) | 2011.07.01 |
About Android Sticky Broadcast Intent( 안드로이드 끈적 끈적한 인텐트에 관하여) (0) | 2011.06.30 |
안드로이드의 구성 (Activity, Intent Receiver, Service, Content Provider) 관련 (0) | 2011.06.30 |
안드로이드 UI 업데이트와 쓰레드 Handler (1) | 2011.06.30 |