본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] 예제를 통해 배우는 AsyncTask. 함께 배워보아요.

by 돼지왕 왕돼지 2012. 1. 20.
반응형


0. Histroy


- 이 글은 2012-01-20 초안 작성 시작하엿습니다.
- 오래된 정보, 잘못된 정보, 오타가 있으면 Comment 로 남겨주세요. 확인 후 수정하겠습니다.
- 이 글은 2012-01-20 초안 작성 완료하였습니다.




1. Prerequisite & References


- Java 기초 지식
- Android 기초 지식
- Thread 기초 지식
 


[Tutorial] 쉽게 사용하는 Thread와 Handler. AsyncTask class 를 통해 해보아요~ (개념)




2. Information


약속한데로 예제를 통해 AsyncTask 를 배워봅시다


예제는 Network 를 통해 다운로드를 받으면서 ProgressDialog 를 업데이트 하는 내용입니다.
( 사실 다운로드를 실제로 수행하지는 않고, 다운로드 하는 것처럼 50ms 를 sleep 하는 형태입니다. )

다운로드의 경우 시간이 오래 걸리기 때문에 Thread에서 처리하는 것이 옳으며,
ProgressDialog의 업데이트의 경우 UI 의 Update 이기 때문에 UI Thread에서 처리해야만 합니다.





AsyncTask 가 제격이겠죠?

ProgressDialog mProgress;
Context mContext;

public void onCreate( Bundle savedInstance ){
   mContext = this;
   new AccumulateTask().execute(100);
 
class AccumulateTask extends AsyncTask<Integer, Integer, Integer> {
   // execute 실행시 가장 먼저 수행되며 MainThread에서 수행. 
   protected void onPreExecute(){
      // dialog 설정 
      mValue = 0;
      mProgress = new ProgressDialog( mContext );
      mProgress.setProgressStyle( ProgressDialog.STYLE_HORIZONTAL );
      mProgress.setTitle( "Updating" );
      mProgress.setMessage( "Wait..." );
      mProgress.setCancelable( false );
      mProgress.setProgress( 0 );
      mProgress.setButton( "Cancel", new DialogInterface.OnClickListener(){
         public void onClick(DialogInterface dialog, int whichButton){
            cancel(true);
         }
      });
      mProgress.show();
   }
 
   // 다른 Thread에서 수행되며, onPreExecute() 후 수행. 
   // arg0 에는 execute( params ) 에서 전달한 100 이 들어온다.
   protected Integer doInBackground(Integer... arg0){
      while ( isCancelled() == false ){
         mValue++;
         if ( mValue <= 100 ){
            // onProgressUpdate() 가 불린다. 
            publishProgress( mValue );
         }
         else{
            break;
         }

         // 다운로드 하는것처럼 위장 
         try { Thread.sleep(50); } catch (InterruptedException e) { ; }
      }
      return mValue;
   }
 
   // doInBackground() 에서 publishProgress를 호출했을 때 Main Thread에서 수행.
   // progress 에는 publishProgress( params ) 에서 전달한 mValue 값이 넘어온다. 
   protected void onProgressUpdate( Integer... progress ){
      mProgress.setProgress(progress[0]);
      mText.setText(Integer.toString(progress[0]));
   }
  
   // doInBackground() 작업이 끝나면 호출되며, MainThread에서 작업 수행 
   // result 값은 doInBackground() 의 Return 값이 들어온다.
 
   protected void onPostExecute(Integer result){
      mProgress.dismiss();
   }
 
   // cancle 되었을 때 호출된다. 
   protected void onCancelled(){
      mProgress.dismiss();
   }
}


자 이제 감이 팍 오시나요?
확실하게 안 오신다면 다시 한번 개념을 잡아보시기 바랍니다.





[Tutorial] 쉽게 사용하는 Thread. AsyncTask class 를 통해 해보아요~ (개념)


손가락 추천 꾸욱~ 더 좋은 글로 보답하겠습니다.


3. Summary


- Network를 통해 파일을 Download 하면서 진행 상태를 ProgressDialog에 표시하는 예제를 통해서 AsyncTask를 파악해보았습니다.




4. References


-  http://developer.android.com/reference/android/os/AsyncTask.html 
  Android developers AsyncTask doc. 

 http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html 
  Android developers Process & Thread Dev Guide.


 

5. Tags

 





반응형

댓글