자바를 했다면 스레드(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 작업이나 서버를 통한 데이터 전송이라든지 상황에 따라서 얼마나 시간이 걸릴지 모르는 건 스레드가 필수다.
사용자 처지에서 보면 버튼 하나 눌렀는데 이후 아무것도 할 수 없다면,
게다가 그 시간이 길어져서 에러 메시지를 뿌리며 앱이 죽어버린다면,
특정 기기 문제, 특정 버전 문제, 테스트를 통해서 나오지 않은 문제가 아닌 이런 단순한 문제로 자신의 앱 별점이 깎인다면 얼마나 가슴 아픈 일인가.
(뭐 꼭 별점이 중요한 건 아니지만……. 크크크- 중요해! 별점!!)
아무튼, 각설하고- 차차 스레드에 대해서 더 알아보도록 하자.
'안드로이드' 카테고리의 다른 글
안드로이드 스튜디오(Android Studio)에서 Eclipse Code Formatter Plugin 추가와 Google Style 적용해보자. (4) | 2016.02.15 |
---|---|
안드로이드 스레드(Thread) AsyncTask를 써보자. (6) | 2015.02.02 |
안드로이드 스레드(Thread)를 써보자. (2) | 2015.02.01 |
안드로이드 스튜디오(Android Studio) 유용한 단축키를 정리해놓자. (0) | 2015.01.31 |
안드로이드 스튜디오(Android Studio) 설치와 글꼴(font)을 설정해보자. (0) | 2015.01.31 |