본문 바로가기

Development/Android

Android 에서 Thread 생성하고 사용하기.

안드로이드 디바이스에서 시간이 많이 걸리는 작업을 할때 일반적으로 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);
    }
}
..........




이런 식으로 사용한다.

일반 메소드에서 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 컨트롤 관련 문제가 겹치고 해서 좀 뒤엉켰음.

생각나는대로 정리해서 앞뒤 구분이 없네. 음.