티스토리 뷰

  Thread에 대한 내용이 궁금하신 분은 아래의 게시물을 읽고 오시면 됩니다.


1. [안드로이드] Thread 예제

2. [안드로이드] Thread Handler 예제


  이번엔 AsyncTask를 이용한 Thread 사용을 살펴보려고 합니다. 이전까지는 Thread를 사용하기 위해서 Thread를 만들어주고 Runnable로 할 일 을 주고 Handler로 메인 Thread에 할 일을 요청하는것들을 했었습니다! 이런 일들을 더 간편하게 해주기 위해서 나온 AsyncTask를 살펴보겠습니다!


AsyncTask

 AsyncTask는 간단히 말하면 Thread를 쉽게 사용하기 위해 만들어졌습니다. AsyncTask의 Override 함수들을 먼저 살펴보겠습니다.


AsyncTask

doInBackground

 Thread 처리를 하고 싶은 코드를 작성해주면된다.

onPreExecute

 doInBackground가 실행되기전에 실행하고 싶은 경우 

onProgressUpdata 

 새로운 Thread가 진행 중 실행하고 싶은 경우 

onPostExecute 

 doInBackground의 수행이 끝난 뒤 실행하고 싶은 경우 


  간략하게 알아보았는데요 크게 두가지의 형태로 나눠지시는게 보이시나요?? doInBackground는 새로운 Thread가 실행되고, 나머지 3개는 Main Thread에서 처리를 하게됩니다!! 그리고 하나 더! 알아두어야 할 것이 있습니다. onProgressUpdate가 하는 일이 새로운 Thread가 진행 중 실행하고 싶은 경우 인데요. 실행 중 실행을 하려면 귀띔을 해주어야지 실행이 가능하겠지요? publicProgress();가 그 역활을 해줍니다. 이제 대략적으로 알아보았으니 실제로 사용을 해보겠습니다.


AsyncTask 예제를 통해 알아보자

  - 전체 코드는 맨 아래에 있습니다 -

  이전 예제들에서 사용했었던 for 문을 10억 번 돌면서 1억 번마다 TextView에 출력을 하는 코드를 짜보겠습니다. 우선 AsyncTask를 상속받는 Class를 만들어주고 AsyncTask의 값으로<Integer, Integer, Void>라 되어있는데 이는 AsyncTask가 제네릭 Class이기 때문에 랩퍼 값으로 int대신 Integer를 double이면 Double을 넣어주셔야 됩니다. 인자는 꼭 3개를 다 넣어주셔야 합니다. 이제 각각의 함수에 대해서 살펴보겠습니다. 우선 onProgressUpdate를 보면 새로운 Thread가 진행 중 실행하고 싶은경우 사용을 합니다. 따라서 새로운 Thread가 1억 번 실행될 때마다 TextView에 입력을 해보겠습니다.


1
2
3
4
5
@Override        
protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            text.setText(text.getText().toString()+"\n"+values[0].intValue()+"번 count했습니다.");
        }
cs

    Integer... 은 Integer가 여러개 만들어진다는 뜻입니다. 따라서 values라는 이름의 Integer 값이 여러 개, 즉 배열로 만들어지게 됩니다. 위에서 바로 아래에서 publicProgress에서 인자를 1개 주었으므로, values[0]에 원하는 i 값이 들어가 있게 되어 values[0]으로 숫자를 불러들였습니다. 그리고 이러한 onProgressUpdate를 실행하려면 publishProgress를 사용해야 한다 언급했었습니다. 다음과 같이 사용을 해주시면 됩니다.

1
if(i%100000000 == 0){ publishProgress(new Integer(i)); }
cs


  Key point는 변수가 배열로 만들어진다!! 랩퍼 class 형태로 만들어진다!! 입니다. 한번 실행을 해보겠습니다.



  잘 되는 것을 볼 수 있습니다. 이제 나머지 함수를 확인해 보겠습니다. onPreExecute는 doInBackground가 시작되기 전에 시작된다고 하였습니다. Count를 Start 한다는 용도로 사용해보겠습니다.


1
2
3
4
5
@Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            text.setText(text.getText().toString()+"\n"+"Count가 끝났습니다.");
        }
cs


  다음으로 onPostExecute도 사용해보겠습니다. doInBackground가 끝나면 실행되는 코드입니다. 따라서 Count가 끝났다는 말로 사용을 하겠습니다.


1
2
3
4
5
@Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            text.setText(text.getText().toString()+"\n"+"Count가 끝났습니다.");
        }
cs


  실행이 잘되나 확인을 해보겠습니다.



  잘 실행이 되네요!! AsyncTask로 간편하게 Thread를 사용해보았습니다. 전체 코드는 다음과 같습니다.


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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class MainActivity extends AppCompatActivity {
    Button button;
    TextView text;
 
    int count2 = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        button = (Button) findViewById(R.id.button);
        text = (TextView) findViewById(R.id.textView);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CountTask count = new CountTask();
                count.execute();
            }
        });
    }
 
    class CountTask extends AsyncTask<Integer, Integer, Void>{
        @Override
        protected Void doInBackground(Integer... params) {
            for(int i=0; i<1000000000;i++){
                if(i%100000000 == 0){ publishProgress(new Integer(i)); }
            }
            return null;
        }
 
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            text.setText(text.getText().toString()+"\n"+values[0].intValue()+"번 count했습니다.");
        }
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            text.setText(text.getText().toString()+"\n"+"Count를 시작하겠습니다.");
        }
 
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            text.setText(text.getText().toString()+"\n"+"Count가 끝났습니다.");
        }
    }
}
cs


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday