안드로이드는 기존에 자바에서 제공하는 Thread 뿐만아니라
AsyncTask라는 스레드 객체를 제공한다.
안드로이드가 AsyncTask 라는 객체를 왜 만들어 제공할까?
아래의 글은 Android Developer 에서 발췌한 일부 글이다.
AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
AsyncTask is designed to be a helper class around Thread
and Handler
and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent
package such as Executor
, ThreadPoolExecutor
and FutureTask
.
An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread.
요약하자면, AsyncTask는 백그라운드 스레드 와 UI 스레드를 같이 쓰기 쉽게 설계했으며,
일반 스레드와 달리, 간단한 작업에 적합하게 만들었다고 설명되어 있다.
백그라운드 스레드와 UI 스레드를 같이 쓰기 쉽다는 말이 무슨 뜻일까?
아래의 설명을 보자.
안드로이드에서의 일처리는 메인스레드(UI 스레드)가 담당한다. 특히 UI와 관련된( ex) TextView,ImageView )
일처리는 메인스레드만 담당 하게끔 설계를 했다. 그래서 메인스레드를 UI스레드라고도 불린다.
따라서 복잡한 계산은 백그라운드 스레드( 메인 스레드가 아닌 다른 스레드의 총칭)에 맡긴후
계산된 결과값을 UI스레드에게 일을 시켜야 하는 것이다.
그래서 AysncTask 라는 객체를 만들었고 위에서 설명한 일들을 쉽게 구현 할 수 있도록 메서드를 제공한다.
아래의 AysncTask 예시를 보자.
import android.os.AsyncTask;
public class MommooAsyncTask 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);
}
}
AsyncTask객체는 abstract로 작성되었다. 따라서, 익명클래스로 사용허던가 위와 같이 상속을 통해서 사용해야 한다.
public class MommooAsyncTask extends AsyncTask<String,Void,String>{
제네릭 인자3개를 정해야한다.
첫번째 인자는 doInBackground 메서드에 선언하는 가변인수 매개변수의 타입을 정한다.
두번째 인자는 onProgressUpdate 메서드에 선언하는 가변인수 매개변수의 타입을 정한다.
세번째 인자는 onPostExecute 메서드에 선언하는 매개변수의 타입을 정한다.
@Override
protected void onPreExecute() {
super.onPreExecute();
}
첫번째 메서드다. 해당 메서드는 이름에서 볼 수 있드시, background스레드를 실행하기전 준비 단계이다.
변수의 초기화나, 네트워크 통신전 셋팅해야할 것들을 위의 메서드 공간에 작성한다.
@Override
protected String doInBackground(String... params) {
return result;
}
두번째 메서드다. 해당 메서드가 background 스레드로 일처리를 해주는 곳이다.
보통 네트워크, 병행 일처리등을 위 메서드 공간에 작성한다.
중요한건 마찬가지로 스레드 이므로 UI스레드가 어떤 일을 하고 있는지 상관없이
별개의 일을 진행한다는 점이다. 따라서 AysncTask는 비동기적으로 작동한다.
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
세번째 메서드는 doInBackground 메서드에서 중간중간에 UI스레드 에게 일처리를 맡겨야 하는 상황일때
쓴다. 매개변수로 Void를 받으므로, doInBackground안에 실제인자가 없이,
publishProgress( ) 메서드를 호출하면 BackgroundThread 중간에 mainThread에게 일을 시킬 수 있다.
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
마지막 메서드다. background Thread가 일을 끝마치고 리턴값으로 result를 넘겨준다.
그 값을 지금 보고 있는 해당 메서드가 매개변수로 받은후 받은 데이터를 토데로
UI스레드에 일처리를 시킬때 쓰는 메서드이다.
보통 UI변경 ( ex) textview.setText("~~") )할때 많이 사용된다. 왜냐면
위에서도 말했다시피 UI변경은 메인스레드가 아닌 다른 스레드에서의 변경은 막았기 때문이다.
위에서 만든 AysncTask를 사용 하는방법은 아래와 같이 하면된다.
MommooAsyncTask asyncTask = new MommooAsyncTask();
asyncTask.execute();
execute의 아규먼트는 doInBackground에서 받는 String... 가변인수이다. 필요시 넣으면 되겠다.
해당 URL은 저번에 작성한 포스팅인데 AsyncTask를 사용하였다. 예시로 보면 될 것이다.
여기까지가 준비한 AysncTask의 내용이다.
직접 Thread와 Handler 를 구현해보고 작성해봤다면,
안드로이드가 제공해주는 AysncTask가 얼마나 편리한지 알 수 있을 것이다.
'Android' 카테고리의 다른 글
안드로이드 SQLiteDB를 사용해보자. (2) (0) | 2016.04.21 |
---|---|
안드로이드 액티비티의 View 정보 구하기. (2) | 2016.04.20 |
안드로이드 Toolbar 적용하기 (1) | 2016.04.01 |
안드로이드 getColor, ContextCompat (1) | 2016.03.03 |
안드로이드 startActivityForResult (0) | 2016.02.27 |
포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.