sitelink1 | https://m.blog.naver.com/contrazant/221331452854 |
---|---|
sitelink2 | |
sitelink3 |
AsyncTask란?
핸들러의 사용 없이 서브 스레드에서 바로 UI 작업을 가능케 해주는 것이 바로 AsyncTask이다
예제
public class MyAsyncTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... strings) {
String result;
String a = strings[0]
//받아온 a를 통한 작업을 result에 담음
return result;
}
@Override
protected void onProgressUpdate(String... params) {
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
<String, String, String>
<doInBackground() 메서드의 리턴 타입, onProgressUpdate() 메서드에서 사용할 변수의 타입, onPostExecute() 메서드에서 사용할 변수의 타입이다.
① onPreExecute()
AsyncTask의 작업은 메인 스레드에서 MyAsyncTask.execute(); 이런 식으로 실행시키는데 이 코드가 실행되면 작업 전에 제일 먼저 onPreExecute() 메서드가 호출된다. 본격적인 작업에 앞서 준비 작업을 진행하는 곳이라고 보면 된다.
② doInBackground()
메인 작업이 실행되는 곳. 이곳에서 실행된 결괏값은 result에 담아 리턴했다.
③ onProgressUpdate()
doInBackground() 작업 도중 publishProgress()를 호출하면 onPressUpdate() 가 실행된다.
사용자에게 진행 상황을 알릴 때 사용된다. (ex. Toast 메시지 : "현재 진행 중입니다.")
④ onPostExecute()
doInBackground()에서 리턴 한 값을 전달받아서 매개변수로 사용한다.
넘겨받은 result를 통해 UI 변경 작업을 진행한다.(ex setText(result))...
AsyncTask의 단점
1. 재사용이 불가능하다.
2. execute 한 Activity가 종료되어도, 별도의 지시가 없다면 AsyncTask는 종료되지 않고 계속 돌아감.
이 단점을 무시한 채 프로그래밍 한다면, 어마어마한 메모리 낭비를 경험할 수 있다