본문 바로가기

Android/AsyncTask 1

Android AsyncTask example

안드로이드에서 Thread 대신 AsyncTask를 이용하여 백그라운드 작업 및 UI 갱신 작업 정의하기

EditText에 숫자를 1초에 한번씩 증가하여 출력하는 내용

main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FF4444CC" > <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" > <requestFocus /> </EditText> </LinearLayout>


ThreadDemo.java

package my.android.test; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.EditText; public class ThreadDemo extends Activity { EditText editText1; int num; boolean isRunning; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); editText1 = (EditText) this.findViewById(R.id.editText1); } @Override protected void onStart() { super.onStart(); isRunning = true; new IncrementTask(this).execute();//아규먼트는 diInBackground()으로 전달됨 } @Override protected void onStop() { super.onStop(); isRunning = false; }

/*내부 클래스로 AsyncTask 를 선언함, Eclipse를 이용하면 오버라이드하는 메소드의 파라미터 타입이나 리턴타입을 자동으로 설정할 수 있기 때문에 그리 복잡하지 않다.

첫번재 파라미터 타입인 Void는 doInBackground()에 전달될 자료형을 의미하며, execute()에서 전달된 자료형과 일치해야 한다.

두번째 파라미터 타입인 Integer는 publishProgress()를 거쳐 onProgressUpdate()에 전달할 자료형을 의미한다.

세번째 파라미터 타입인 Void는 doInBackground()의 리턴타입을 정의하고 이 타입은 onPostExecute()으로 전달된다

*/ class IncrementTask extends AsyncTask<Void, Integer, Void> { Context ctx; IncrementTask(Context ctx) { this.ctx = ctx; } @Override /* 백그라운드 쓰레드에 의해 호출됨 */ protected Void doInBackground(Void... params) { for (int i=0 ; i<10 && isRunning ; i++) {

/* 위에서 선언한 Integer 형을 publishProgress()에 사용함 */ publishProgress(++num); /* onProgressUpdate()호출을 요청함 */ SystemClock.sleep(1000); } return null; } @Override 

/* 시스템의 UI 쓰레드에 의해 호출되므로 UI갱신이 가능함. publishProgress()의 아규먼트가 결국 이곳까지 전달됨 */ protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); editText1.setText(values[0]+""); } @Override 

/* 시스템의 UI 쓰레드에 의해 호출되므로 UI갱신이 가능함, 백그라운드 쓰레드 종 료시에 호출됨. doInBackground()의 리턴값이 이곳으로 전달됨 */ protected void onPostExecute(Void result) { super.onPostExecute(result); Toast.makeText(ctx, "백그라운드 작업완료", Toast.LENGTH_SHORT).show(); } } /* 내부클래스 끝 */ }