안드로이드2015. 1. 30. 11:18

자바를 했다면 스레드(Thread)는 대충이라도 봤기에 낯설지는 않을 것 같다.

그래도 생소한 이를 위해 간단히 예를 들자면, 밥 먹을 때 밥통 취사 버튼 누르고 밥 다 되는 동안 먹기 위한 준비랄까.

뭐 국을 끓인다든가, 물이 끓기 전에 계란말이를 한다든가.

우리가 밥통에 취사 버튼을 누른다고 해서 그 밥이 다 될 때까지 아무것도 하지 않고 기다리고 있지는 않지 않은가.

이처럼 무언가를 돌려놓고 다른 여러 가지 일을 처리하는 것, 이게 스레드 능력이라고 할 수 있다.


안드로이드에서 일례를 본다면, 무언가 시간이 엄청나게 걸리는 작업이 있는데 그 일을 하라고 지시하는 버튼이 있다고 치자.

이 버튼을 누르면 내부적으로 열심히 작업하며 일을 처리해 나간다.

근데 이 버튼을 눌러서 처리하는 작업을 스레드 없이 시켰다간 그 일이 전부 끝날 때까지 멈춰있는 화면만 볼 수밖에 없다. 취사 버튼 누르고 밥통만 쳐다보듯이 말이다.

현실에서 보면 이처럼 멍청한 일이 없는데 프로그램을 개발하다 보면 그게 참 쉽지 않다.

스레드를 쓰다 보면 스레드 간의 동기화를 고려해서 소프트웨어를 설계해야 하므로 좀 많이 복잡해질 수도 있으니 말이다.

어쨌든, 일단 오래 걸리는 작업은 스레드를 걸자. 일단 이것만 알고 봐보도록 하자.


왜 안드로이드에서는 반드시 스레드를 써야 하는가.

새로운 프로젝트를 생성해서 아래 소스를 실행을 해보면 10초간 버튼이 눌린 상태로 아무것도 할 수 없게 된다.

지금은 어떨는지 모르겠으나 초창기 안드로이드는 뻗었다. 그 유명한 ANR(Android Not Responding)을 보게 된다.


package kr.corej.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void mOnClick(View view) {
        switch (view.getId()) {
            case R.id.button:
                countdown();
                Toast.makeText(getApplicationContext(), "땡!", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    private void countdown() {
        for (int j = 0; j < 10; j++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

모든 버튼에 스레드를 걸어서 작업하라는 건 아니다.

하지만 시간이 조금이라도 필요한 작업은 스레드를 걸어야만 한다.

DB 작업이나 서버를 통한 데이터 전송이라든지 상황에 따라서 얼마나 시간이 걸릴지 모르는 건 스레드가 필수다.


사용자 처지에서 보면 버튼 하나 눌렀는데 이후 아무것도 할 수 없다면,

게다가 그 시간이 길어져서 에러 메시지를 뿌리며 앱이 죽어버린다면,

특정 기기 문제, 특정 버전 문제, 테스트를 통해서 나오지 않은 문제가 아닌 이런 단순한 문제로 자신의 앱 별점이 깎인다면 얼마나 가슴 아픈 일인가.

(뭐 꼭 별점이 중요한 건 아니지만……. 크크크- 중요해! 별점!!)


아무튼, 각설하고- 차차 스레드에 대해서 더 알아보도록 하자.


코어제이 홈페이지 제작 소개


코어제이 캔디 앱 소개


Posted by 코어제이