안드로이드 디바이스에서 시간이 많이 걸리는 작업을 할때 일반적으로 thread 로 실행한다.
그런데 thread 를 하나만 만들어 놓고 실행한다면 그 thread 가 끝날때까지는 아무런 작업도 하지 못하고 기다려야 한다.
만약 빨리 끝나지 않는 작업이라면 그동안 전화기를 사용할 수 없다.
이렇게 UI 자원을 여러 thread 가 접근해서 사용하기 위한 몇가지 방법이 있는데 그중에서 handler 를 살펴 보자면.
1. thread 를 정의한 뒤
2. handler 를 선언해 놓고
3. 그 handler 에 thread 를 등록하고
4. 필요한 곳에서 sendMessage 로 호출하는 방법이다.
이런 식으로 사용한다.
일반 메소드에서 UI 를 컨트롤하기 위한 thread 를 호출하기 위해서 먼저 integer 값을 선언해놓는다.
그리고 실행하기 위한 thread 를 Runnable 로 정의하고 handler 를 생성한 뒤 그 안에 runOnUiThread 로 실행하도록 정의한다.
실행하고자 하는 메소드안에서 integer 를 sendMessage 로 handler 에게 보내면 handler 가 받아서 runOnUiThread 로 실행한다.
그 thread 는 UI thread 위에서 동작하며 UI 관련 컨트롤을 할 수 있다.
UI thread 를 컨트롤하기 위해서 정의한 방법이며 일반적인 로직을 수행하기 위한 thread 는 runOnUiThread 로 동작하지 않아도 상관없다.
(예를 들면 데이터베이스에 입력한다던지..)
정리하자면,
일반 로직을 실행하기 위한 thread 와 UI 를 컨트롤하기 위한 thread 실행방법은 조금 틀리다.
먼저 모든 thread 를 handler 에 등록해 놓고
일반 메소드를 생성한 뒤에 그 안에서 thread 를 정의하고 run 하면 되지만,
UI 를 컨트롤 하기 위한 thread 는 반드시 Runnable 로 생성한 뒤 handler 안에서 runOnUiThread() 로 UI Thread 위에서 실행해야 한다.
처음 "view 를 만든 original thread 만이 그 view 를 수정할 수 있다." 이런 thread 오류가 발생했을때
UI 를 만든 thread 가 아닌 다른 thread 가 UI 를 수정하려고 했기 때문에 발생했던 오류여서 말 그대로 처음 UI 를 만든 thread 위에서 돌아가면 뒤에 만든 그 thread 도 처음 thread 가 만든 UI 를 수정할 수 있다.
그래서 runOnUiThread 를 사용한다.
runOnUiThread 위에는 Runnable thread 를 올려야 하며, 일반 메소드를 올리면 오류가 발생한다.
runOnUiThread(getNewsList); -> 정상작동.
runOnUiThread(getNewsList()); -> 오류발생.
테스트중에 계속 오류가 발생했던 것은 runOnUiThread 위에서 실행하지 않은것이 원인이었음.
UI 와 관련없는 로직을 위한 thread 는 일반 메소드에 정의하고 handler 에 등록시켜서 사용하면 무난하게 작동한다.
처음 떴던 오류때문에 handler 에 등록하다가 UI thread 컨트롤 관련 문제가 겹치고 해서 좀 뒤엉켰음.
생각나는대로 정리해서 앞뒤 구분이 없네. 음.
그런데 thread 를 하나만 만들어 놓고 실행한다면 그 thread 가 끝날때까지는 아무런 작업도 하지 못하고 기다려야 한다.
만약 빨리 끝나지 않는 작업이라면 그동안 전화기를 사용할 수 없다.
이렇게 UI 자원을 여러 thread 가 접근해서 사용하기 위한 몇가지 방법이 있는데 그중에서 handler 를 살펴 보자면.
1. thread 를 정의한 뒤
2. handler 를 선언해 놓고
3. 그 handler 에 thread 를 등록하고
4. 필요한 곳에서 sendMessage 로 호출하는 방법이다.
.............
public static final int THREAD_NEWS_VIEW = 198;
.............
private void onCreate() {
..........
mHandler.sendMessage(mHandler.obtainMessage(THREAD_NEWSISNEWS_VIEW));
..........
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case THREAD_NEWS_VIEW :
runOnUiThread(getNewsList);
break;
}
}
};
............
private Runnable = new Runnable() {
@Override
public void run() {
setListAdapter(newsAdapter);
}
}
..........
public static final int THREAD_NEWS_VIEW = 198;
.............
private void onCreate() {
..........
mHandler.sendMessage(mHandler.obtainMessage(THREAD_NEWSISNEWS_VIEW));
..........
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case THREAD_NEWS_VIEW :
runOnUiThread(getNewsList);
break;
}
}
};
............
private Runnable = new Runnable() {
@Override
public void run() {
setListAdapter(newsAdapter);
}
}
..........
이런 식으로 사용한다.
일반 메소드에서 UI 를 컨트롤하기 위한 thread 를 호출하기 위해서 먼저 integer 값을 선언해놓는다.
그리고 실행하기 위한 thread 를 Runnable 로 정의하고 handler 를 생성한 뒤 그 안에 runOnUiThread 로 실행하도록 정의한다.
실행하고자 하는 메소드안에서 integer 를 sendMessage 로 handler 에게 보내면 handler 가 받아서 runOnUiThread 로 실행한다.
그 thread 는 UI thread 위에서 동작하며 UI 관련 컨트롤을 할 수 있다.
UI thread 를 컨트롤하기 위해서 정의한 방법이며 일반적인 로직을 수행하기 위한 thread 는 runOnUiThread 로 동작하지 않아도 상관없다.
(예를 들면 데이터베이스에 입력한다던지..)
정리하자면,
일반 로직을 실행하기 위한 thread 와 UI 를 컨트롤하기 위한 thread 실행방법은 조금 틀리다.
먼저 모든 thread 를 handler 에 등록해 놓고
일반 메소드를 생성한 뒤에 그 안에서 thread 를 정의하고 run 하면 되지만,
UI 를 컨트롤 하기 위한 thread 는 반드시 Runnable 로 생성한 뒤 handler 안에서 runOnUiThread() 로 UI Thread 위에서 실행해야 한다.
처음 "view 를 만든 original thread 만이 그 view 를 수정할 수 있다." 이런 thread 오류가 발생했을때
UI 를 만든 thread 가 아닌 다른 thread 가 UI 를 수정하려고 했기 때문에 발생했던 오류여서 말 그대로 처음 UI 를 만든 thread 위에서 돌아가면 뒤에 만든 그 thread 도 처음 thread 가 만든 UI 를 수정할 수 있다.
그래서 runOnUiThread 를 사용한다.
runOnUiThread 위에는 Runnable thread 를 올려야 하며, 일반 메소드를 올리면 오류가 발생한다.
runOnUiThread(getNewsList); -> 정상작동.
runOnUiThread(getNewsList()); -> 오류발생.
테스트중에 계속 오류가 발생했던 것은 runOnUiThread 위에서 실행하지 않은것이 원인이었음.
UI 와 관련없는 로직을 위한 thread 는 일반 메소드에 정의하고 handler 에 등록시켜서 사용하면 무난하게 작동한다.
처음 떴던 오류때문에 handler 에 등록하다가 UI thread 컨트롤 관련 문제가 겹치고 해서 좀 뒤엉켰음.
생각나는대로 정리해서 앞뒤 구분이 없네. 음.
'Development > Android' 카테고리의 다른 글
Android Activity Life Cycle. (0) | 2010.07.26 |
---|---|
리스트 출력하고 그 중에서 원하는 하나의 정보를 가져오기. (0) | 2010.07.22 |
서버에서 이미지 로딩하기. (0) | 2010.07.20 |
APK 파일 인스톨 옵션 설정하기. (0) | 2010.07.09 |
eclipse 에서 생성한 프로젝트를 intellij 에 import 했을때 안드로이드 라이브러리가 잡히지 않으면.. (0) | 2010.07.06 |