본문 바로가기

IT/한이음 IT멘토링(Android Programming)

06. AsyncTask

AsyncTask는 안드로이드에서 Thread사용시 좀더 간편하게 하기위해서 만들어진 놈이다.

가장 첫번째로 설명할 것으로 이 AsyncTask에는 다음과 같은 4개의 주요한 method들이 필요하다.

1) void onPreExecute()

2) Result doInBackground(Params... params)

3) void onProgressUpdate(Progress... values)


4)void onPostExecute(Result result)


1번... 쓰레드 실행 전에 정확히 Background 실행전 실행 될 내용(initial 코드)

2번... Background 실행 내용(반복되는 내용)

3번... Background에서 변경되는 부분 Update

4번... 쓰레드 종료 후 알리는 내용


실제 예제 코드는 다음과 같은 구조로 짤 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainActivity extends Activity implements OnClickListener {
 
    private Button m_click;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        m_click = (Button) findViewById(R.id.bt_click_noti);
        m_click.setOnClickListener(this);
 
    }
 
    public void onClick(View v) {
        new myAsynctask().execute();
    }
 

메인 UI의 버튼을 통해 이벤트를 통해 쓰레드를 실행하게 했다.

그리고 AsyncTask를 사용하기위해선 subclassing을 해야한다. 
<Void, Integer, Void>는 각각 Background작업의 매개변수, onProgressUpdate의 매개변수, doInBackground 의 리턴값을 말한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private class myAsynctask extends AsyncTask<Void, Integer, Void> {  
 
        @Override
        protected void onPreExecute() {
            textResult.setText("Background 작업 시작 ");           
            super.onPreExecute();
        }
 
        @Override
        protected Void doInBackground(Void v) {
            while(true)
            {
                  ....  
            if(조건)
                 publishProgress(integer형 변수);
            }            
        }
 
        @Override
        protected void onProgressUpdate(Integer... progress) {
            
        }
        
        @Override
        protected void onPostExecute(Int result) {
            textResult.setText("Background 작업 끝"); 
        }
}

Background에서 while문이 실행되고 조건에 만족했을때 루프를 끝내거나 publishProgress를 사용해서 UI에 메시지를 전달할 수 있다.

보통 숫자 1,2,3 ... 을 전송하고 onProgressUpdate에서 switch-case를 써서 컨트롤하면 편리하다.