2012년 8월 8일 수요일

안드로이드 쓰레드 8/10

7에서 말한 Future Task를 가만 보면 AsyncTask를 닮았다.



http://developer.android.com/reference/android/os/AsyncTask.html
에 보면



AsyncTask must be subclassed to be used. The subclass will override at least one method (doInBackground(Params...)), and most often will override a second one (onPostExecute(Result).)
Here is an example of subclassing:
 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }
요렇게 만들고 
 
Once created, a task is executed very simply:
 new DownloadFilesTask().execute(url1, url2, url3);

요렇게 쓴다고 되어 있다.




안드로이드 포스팅 중에 고수라 할 수 있는


http://tigerwoods.tistory.com/20

이곳에 가면 풀소스를 구할 수 있다.

XML이야 버튼이랑 텍스트뷰 버튼 하나 기본으로 달아 주면 소스를 실행할 수 있다.

package com.example.test1;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class AsyncTaskDemo extends Activity implements View.OnClickListener {

 ProgressBar progressBar;
 TextView textResult;
 Button btnExecuteTask;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  progressBar = (ProgressBar) findViewById(R.id.progressBar1);
  textResult = (TextView) findViewById(R.id.textView2);
  btnExecuteTask = (Button) findViewById(R.id.button1);

  btnExecuteTask.setOnClickListener(this);
 }

 public void onClick(View v) {

  // AsynchTask를 상속하는 DoComplecatedJob 클래스를 생성하고
  // execute(...) 명령으로 background작업을 시작함.
  // (예제에 구현된 AsynchTask는 String 형의 인자를 받음)
  new AsyncTaskTestClass().execute("100", "200", "309", "404", "505");
 }

 // AsyncTask클래스는 항상 Subclassing 해서 사용 해야 함.
 // 사용 자료형은
 // background 작업에 사용할 data의 자료형: String 형
 // background 작업 진행 표시를 위해 사용할 인자: Integer형
 // background 작업의 결과를 표현할 자료형: Long
 private class AsyncTaskTestClass extends AsyncTask {

  // 이곳에 포함된 code는 AsyncTask가 execute 되자 마자 UI 스레드에서 실행됨.
  // 작업 시작을 UI에 표현하거나
  // background 작업을 위한 ProgressBar를 보여 주는 등의 코드를 작성.
  @Override
  protected void onPreExecute() {
   textResult.setText("Background 작업 시작 ");
   super.onPreExecute();
  }

  // UI 스레드에서 AsynchTask객체.execute(...) 명령으로 실행되는 callback
  @Override
  protected Long doInBackground(String... strData) {
   long totalTimeSpent = 0;

   // 가변인자의 갯수 파악 (이 예제에서는 5개)
   int numberOfParams = strData.length;

   // 인자들을 이용한 어떤 작업을 처리를 함
   for (int i = 0; i < numberOfParams; i++) {

    // 각 인자를 이용한 복잡한 Task 실행함.
    // 예제에서는 인자로 전달된 시간만큼 sleep
    SystemClock.sleep(new Integer(strData[i]));

    // background 작업에 걸린시간을 누산해 리턴함
    totalTimeSpent += new Long(strData[i]);

    // onProgressUpdate callback을 호출 해
    // background작업의 실행경과를 UI에 표현함
    publishProgress((int) (((i + 1) / (float) numberOfParams) * 100));
   }
   return totalTimeSpent;
  }

  // onInBackground(...)에서 publishProgress(...)를 사용하면
  // 자동 호출되는 callback으로
  // 이곳에서 ProgressBar를 증가 시키고, text 정보를 update하는 등의
  // background 작업 진행 상황을 UI에 표현함.
  // (예제에서는 UI스레드의 ProgressBar를 update 함)
  @Override
  protected void onProgressUpdate(Integer... progress) {
   progressBar.setProgress(progress[0]);
  }

  // onInBackground(...)가 완료되면 자동으로 실행되는 callback
  // 이곳에서 onInBackground가 리턴한 정보를 UI위젯에 표시 하는 등의 작업을 수행함.
  // (예제에서는 작업에 걸린 총 시간을 UI위젯 중 TextView에 표시함)
  @Override
  protected void onPostExecute(Long result) {
   textResult.setText("Background 작업에 걸린 총 시간: " + new Long(result).toString() + "m초");
  }

  // AsyncTask.cancel(boolean) 메소드가 true 인자로
  // 실행되면 호출되는 콜백.
  // background 작업이 취소될때 꼭 해야될 작업은 여기에 구현.
  @Override
  protected void onCancelled() {
   // TODO Auto-generated method stub
   super.onCancelled();
  }
 }
}


쓰레드 9, 10은 언젠가 프로젝트에 적용하면서 포스팅 하겠다.

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...