티스토리 뷰
Thread에 대한 내용이 궁금하신 분은 아래의 게시물을 읽고 오시면 됩니다.
이번엔 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 |
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 |
'안드로이드' 카테고리의 다른 글
[안드로이드] 백 버튼 팝업창 종료 이벤트 예제 (0) | 2017.04.22 |
---|---|
[안드로이드] ProgressBar(프로그래스바) 예제 (0) | 2017.04.21 |
[안드로이드] Thread Handler 예제 (0) | 2017.04.20 |
[안드로이드] Thread 예제 (1) | 2017.04.20 |
[안드로이드] TextView 사용(활용,효과) 예제 (0) | 2017.04.19 |
- Total
- Today
- Yesterday