안드로이드에서는 자바에서 제공하는 쓰레드 개념을 그대로 사용할 수 있다.
다만, 안드로이드에서는 리소스가 컴퓨터에 비해 한정적이기 때문에 좀 더 철저하게 관리된다.
즉, 뷰에 관한 일처리는 메인쓰레드만이 담당하게 된다. UI 쓰레드라고도 부른다.
백그라운드 쓰레드(메인쓰레드 이외 쓰레드들을 총칭)에게 복잡하거나 비교적 시간이 걸리는 작업을
임한 뒤, 결과값을 메인쓰레드로 다시 받아서 결국 마무리는 메인쓰레드가 하는 방식이라 할 수 있다.
이러한 작업을 쉽게 하기위해서 핸들러라는 개념도 있지만, AsyncTask라는 것을 사용해보고자 한다.
AsyncTask는 백그라운드 쓰레드와 UI 쓰레드(메인 스레드)를 같이 쓰게 쉽게 하기 위해 설계하였다.
또한 메소드의 이름이 어떤 기능을 갖는 메소드인지를 명확하게 알 수 있어 핸들러보다 다루기 쉽다.
public class MommooAsyncTask extends AsyncTask<String,Void,String>
위와 같이 선언할 때, 제네릭 매개변수 3개를 정해야한다.
첫 번째 : doInBackground 메소드에서 선언하는 매개변수의 타입을 지정한다
두 번쨰 : onProgressUpdate 메소드에서 선언하는 매개변수의 타입을 지정한다
세 번째 : onPostExecute 메소드에서 선언하는 매개변수의 타입을 지정한다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
import android.os.AsyncTask;
public class AsyncTaskExam extends AsyncTask<String,Void,String>{
public String result;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
return result;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}
mmmmmmmmmmmmmmmmmmmmmmmmmmmmm
@Override
protected void onPreExecute() {
super.onPreExecute();
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
가장 먼저 나오는 메소드인 onPreExecute() 메소드는 doInBackground() 메소드..
즉, background스레드를 실행하기 전 준비를 하는 메소드이다.
변수를 초기화하거나 프로그레스 바 생성, 네트워크 통신 전 환경 세팅등을 여기서 진행한다.
@Override
protected String doInBackground(String... params) {
return result;
}
두 번째 나오는 이 메소드가 핵심이다.
이 메소드 background 스레드로 작업을 수행하는 부분이다.
네트워크 접속이나 DB 접속 등 비교적 시간 소요가 큰 일처리를 이 메소드에 작성한다.
background 스레드이므로 메인쓰레드의 작업과는 상관없이 별개로 독립적으로 수행을 한다.
따라서 AsyncTask는 비동기적으로 작동한다고 할 수 있다.
만약, 메인쓰레드가 이 작업을 한다면?
버튼을 클릭했을 때, 서버에 접속해서 이미지를 갖고 오는 앱이 있다고 가정해보자.
AsyncTask를 쓰면, 버튼을 눌렀다 떼면 이미지를 갖고 오는 동안 잠실 기다려달라는 텍스트를 보여준다거나, 다른 화면을 보여준다거나, 프로그래스바를 돌리는 작업을 할 수 있다.
하지만, 메인쓰레드에서 이 작업을 수행하면 버튼을 누른 그 상태 그대로 멈춰버리며
서버에서 이미지를 가져오는 작업이 완료될때까지 유저는 아무런 액션도 할 수 없다.
또한 최근 버전에서는 그러한 상태를 방지하기 위해 아예 에러를 출력하며 앱을 강제 종료시키므로 선택이 아닌 필수이다.
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
세 번째 메소드는 doInBackground 메소드 동작 시 중간중간 메인쓰레드에게 일을 맡겨야 할때 사용한다. 위 예제의 경우 매개변수가 Void이므로 호출한 쪽에서는 ()으로 그냥 호출한다.
즉, onProgressUpdate()메소드를 호출하면 백그라운드 쓰레드 중간에 메인쓰레드에게 일을 시킬 수 있다.
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
마지막 메소드는 Bckground 쓰레드(doInBackground())가 일을 끝마치고 리턴값으로 result를 넘겨준것을 매개변수로 받는다. 그 값을 갖고 메인 쓰레드에게 일처리를 시킬때 사용하는 메소드이다.
정리하면,
doInBackground()메소드는 메인 쓰레드가 아닌 백그라운드 쓰레드이며,
나머지 메소드들은 백그라운드 쓰레드가 아니라 메인 쓰레드에서 동작한다.
(추후에 상시 업데이트 예정)